Skip to content
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

feat: implement new login and "connect project" logic #23762

Merged
merged 174 commits into from
Oct 24, 2022
Merged
Show file tree
Hide file tree
Changes from 163 commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
7276fd9
wip app prep for top-level modals
marktnoonan Aug 19, 2022
10c31f0
barebones login connect modal component with store + test
marktnoonan Aug 19, 2022
6988e9e
wip moving things to frontend-shared
marktnoonan Aug 23, 2022
939faab
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Aug 25, 2022
8cbeca0
update gql schemas
marktnoonan Aug 25, 2022
809dd3d
wip wiring up LoginConnect
marktnoonan Aug 25, 2022
58e4ccd
move login modal to modals folder
marktnoonan Aug 25, 2022
5bdb629
move login modal to modals folder
marktnoonan Aug 25, 2022
2ae7e0d
move login modal to modals folder
marktnoonan Aug 25, 2022
8cc921b
get basic test for login modal working
marktnoonan Aug 25, 2022
2f201f8
move cloud modals to frontend-shared
marktnoonan Aug 26, 2022
6bd7381
add new component to root of app and launchpad
marktnoonan Aug 26, 2022
3aa9da2
use new component in header bar
marktnoonan Aug 26, 2022
0a37597
wire up events to manage flow
marktnoonan Aug 26, 2022
6048a94
refactor open/close, fix test
marktnoonan Aug 26, 2022
b6fa50f
close modals correctly in error state
marktnoonan Aug 27, 2022
03b082c
move query into LoginConnectModals component
marktnoonan Aug 27, 2022
0411b0d
tempfix for global mode opening project
marktnoonan Aug 27, 2022
ee37e2c
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Sep 1, 2022
ede11eb
wip make top-level query in LoginConnectModals
marktnoonan Sep 2, 2022
e476d8d
move login modal to top
marktnoonan Sep 6, 2022
ff63834
gql updates to avoid infinite loop in testing
marktnoonan Sep 6, 2022
4fa6aaa
make a wrapper for easier component testing
marktnoonan Sep 6, 2022
5183162
make a wrapper for easier component testing
marktnoonan Sep 6, 2022
34c8265
simplify test condition
marktnoonan Sep 6, 2022
4b7e2f6
update some intercepts
marktnoonan Sep 7, 2022
62f9194
tweaks to always allow closing to work
marktnoonan Sep 7, 2022
f0f7b74
temporarily match another query for testing
marktnoonan Sep 7, 2022
530007e
clean up
marktnoonan Sep 7, 2022
fa3b4c6
add extra query for testing
marktnoonan Sep 7, 2022
1818717
remove test that can't run in CT any more
marktnoonan Sep 7, 2022
7996152
close login on connect-project event from cloud connect button
marktnoonan Sep 7, 2022
6c12345
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Sep 8, 2022
941a7fe
add test for utm source and medium on nav login
marktnoonan Sep 8, 2022
8bba896
fix test that was clicking the wrong button
marktnoonan Sep 8, 2022
df8d609
refactor to use new system for CloudConnectButton
marktnoonan Sep 8, 2022
1f80232
set isLoggedIn + isProjectConnected in store
marktnoonan Sep 9, 2022
475a251
use store instead of emits for login success
marktnoonan Sep 9, 2022
d298b9e
tweaks for ts
marktnoonan Sep 9, 2022
1d6393d
add missing gql fragment
marktnoonan Sep 9, 2022
4082b0f
add comment explaining LoginConnectModals
marktnoonan Sep 9, 2022
6b96271
update test
marktnoonan Sep 9, 2022
040031a
dial in logic
marktnoonan Sep 9, 2022
5a9de4b
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Sep 9, 2022
24f8a24
fix ts
marktnoonan Sep 9, 2022
493c433
make utm medium dynamic in cloud connect modals
marktnoonan Sep 9, 2022
24f99c6
clean up utm params
marktnoonan Sep 9, 2022
d221055
improve global mode behavior
marktnoonan Sep 10, 2022
d94df20
wip add status to store
marktnoonan Sep 13, 2022
ac5fc6d
wip add status to store
marktnoonan Sep 13, 2022
e6b5d6a
wip
marktnoonan Sep 13, 2022
19cc7d5
Merge branch 'develop' into mark-and-stokes/login-modals
warrensplayer Sep 19, 2022
e9329b6
Fixing tests after merge from develop
warrensplayer Sep 21, 2022
8e89aa6
Fix for test in open mode
warrensplayer Sep 21, 2022
57bc7fb
Moving more responsibility into the store
warrensplayer Sep 22, 2022
215d237
Merge branch 'develop' into mark-and-stokes/login-modals
warrensplayer Sep 23, 2022
5e5cca3
Fix typescript
warrensplayer Sep 23, 2022
f51a9d8
Merge branch 'develop' into mark-and-stokes/login-modals
warrensplayer Sep 26, 2022
1644231
Merge branch 'mark-and-stokes/login-modals' of https://github.com/cyp…
marktnoonan Sep 27, 2022
0a3a760
check for route name before checking name
marktnoonan Sep 27, 2022
f3d5b7a
get project id from config
marktnoonan Sep 27, 2022
ce1c85e
add clarifying comment
marktnoonan Sep 28, 2022
4f4e778
set state in store for banner tests
marktnoonan Sep 28, 2022
7b16441
adding guard in launchpad for config being loaded
warrensplayer Sep 28, 2022
8a82f12
Remove guard because it broke authChange tests
warrensplayer Sep 28, 2022
1c33a43
wip rules
marktnoonan Sep 29, 2022
9e67eba
move isAllowedFeature into promptManager
marktnoonan Sep 29, 2022
3ceba41
e2e tests for header bar in launchpad
warrensplayer Sep 30, 2022
1d6d556
Fix flaky test
warrensplayer Sep 30, 2022
a73d165
update BannersState type
marktnoonan Sep 30, 2022
a69fcde
extract isAllowedFeature and test
marktnoonan Sep 30, 2022
efc47b4
Merge branches 'mark-and-stokes/login-modals' and 'mark-and-stokes/lo…
marktnoonan Sep 30, 2022
95a6c67
set banner state
marktnoonan Sep 30, 2022
785fe4e
resolve conflicts
marktnoonan Oct 2, 2022
570b651
tempfix for ts
marktnoonan Oct 2, 2022
b3e7092
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 2, 2022
208e4c1
proper fix for type issue
marktnoonan Oct 2, 2022
a4747b8
update types, test _disabled
marktnoonan Oct 2, 2022
ebb2792
fix type import
marktnoonan Oct 2, 2022
771df0e
clean up some names and types for clarity
marktnoonan Oct 3, 2022
cb166fd
tweak test, clean up code
marktnoonan Oct 3, 2022
c91b8cb
comments and test tweaks
marktnoonan Oct 4, 2022
0552d2c
Adding check for hasNonExampleSpec
warrensplayer Oct 6, 2022
384e02f
clean up some comments
marktnoonan Oct 6, 2022
1cea77f
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 6, 2022
03e0b1a
updates post-merge
marktnoonan Oct 6, 2022
c20c567
fix path
marktnoonan Oct 6, 2022
9ea344c
fix missing import
marktnoonan Oct 6, 2022
561a648
improve readability of CloudViewerAndProject
marktnoonan Oct 6, 2022
d7ce339
Fixing RecordBanner
warrensplayer Oct 7, 2022
350ea02
small tweak to variable
marktnoonan Oct 7, 2022
9bb42a5
Merge branch 'mark-and-stokes/login-modals' of https://github.com/cyp…
marktnoonan Oct 7, 2022
26f7a9f
merge
marktnoonan Oct 10, 2022
ecd8089
Connecting RecordRunModal to modal flow
warrensplayer Oct 11, 2022
5d7f0eb
Merge branch 'mark-and-stokes/login-modals' of https://github.com/cyp…
marktnoonan Oct 13, 2022
9fca485
merge pref objects instead of doing a single loop
marktnoonan Oct 13, 2022
9672175
set banners state specifically to avoid stepping on other values
marktnoonan Oct 13, 2022
0977a0c
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 13, 2022
9461d13
update comment
marktnoonan Oct 13, 2022
cfb56d1
use `setPreferences` instead of `setPromptShown`
marktnoonan Oct 13, 2022
017579a
Merge branch 'mark-and-stokes/login-modals' of https://github.com/cyp…
marktnoonan Oct 13, 2022
19423e3
clean up gql query
marktnoonan Oct 13, 2022
9495978
simplify banners code
marktnoonan Oct 14, 2022
35b984e
remove defunct prop from tests
marktnoonan Oct 15, 2022
748de6b
fix flaky test
marktnoonan Oct 15, 2022
23efaa8
add unref
marktnoonan Oct 17, 2022
7ae01c2
add extra fields to login-connect-store
marktnoonan Oct 17, 2022
79e9c17
prevent connecting without picking project, prevent unwanted project …
marktnoonan Oct 17, 2022
91b8db0
simplify events in SpecsListCloudButton
marktnoonan Oct 17, 2022
c3fd39b
ensure firstOrganization alias field is present in query
marktnoonan Oct 17, 2022
580bccd
clean up reconnect project event
marktnoonan Oct 17, 2022
0dff819
simplify events in loginModal
marktnoonan Oct 17, 2022
85f08ae
wire up RecordRunModal
marktnoonan Oct 17, 2022
6591fa7
simplify events around LoginConnect modals
marktnoonan Oct 17, 2022
2ec8649
add frontend-shared composables to gql test codegen
marktnoonan Oct 17, 2022
9c39fca
cleanup
marktnoonan Oct 17, 2022
497a45f
add extra states, don't reset org values without a cloudViewer
marktnoonan Oct 17, 2022
f6f3cbe
use store in Auth & clean up events
marktnoonan Oct 17, 2022
20ecb39
fix displayed text in real test situations
marktnoonan Oct 17, 2022
301cdf2
remove some LoginModals and related events
marktnoonan Oct 17, 2022
b2e5989
fix up some gql intercepts in tests
marktnoonan Oct 17, 2022
6b07a36
drive spec header tooltip state from the store
marktnoonan Oct 17, 2022
d15f9ed
clean up comment
marktnoonan Oct 17, 2022
0e7f2db
fix test for close of record run modal
marktnoonan Oct 17, 2022
e10f0e0
use new values in state setup for test
marktnoonan Oct 17, 2022
5e517ad
improve rule for disabling create project button
marktnoonan Oct 17, 2022
8e092fd
set extra value in test
marktnoonan Oct 17, 2022
0b66d17
more test setup for modal states
marktnoonan Oct 17, 2022
6e66b48
cleanup some login modal tests
marktnoonan Oct 17, 2022
5db96e0
only render login-connect modal when it is open
marktnoonan Oct 18, 2022
630fe55
intercept firstOrganization in some tests
marktnoonan Oct 18, 2022
8c68329
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 18, 2022
4bc3cd8
fix up tests failing after merging develop in
marktnoonan Oct 18, 2022
1e8668f
commit graphql schema updates
marktnoonan Oct 18, 2022
609a439
fix casing text
marktnoonan Oct 18, 2022
83f09cc
remove CloudConnectModals
marktnoonan Oct 18, 2022
bcb54e0
add some missing test coverage
marktnoonan Oct 18, 2022
92c2a78
add UTM param
marktnoonan Oct 18, 2022
84b0ef1
tweaks for test stability
marktnoonan Oct 18, 2022
e315b20
switch v-if back to `organizations`, child component needs it
marktnoonan Oct 18, 2022
cf24ac1
wait for createCloudOrgUrl before rendering modal
marktnoonan Oct 18, 2022
fca93b3
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 19, 2022
4f871aa
avoid brief flicker of no modal
marktnoonan Oct 19, 2022
51a1a89
properly close modal if there is no action for user
marktnoonan Oct 19, 2022
3b71016
avoid fallback # for link
marktnoonan Oct 19, 2022
e444839
remove refetch since parent modal refetches, and switch back to check…
marktnoonan Oct 19, 2022
d7b3444
remove unused fragment
marktnoonan Oct 19, 2022
865b465
avoid unsetting 'isProjectConnected'
marktnoonan Oct 19, 2022
b59d4d7
Update auth query
marktnoonan Oct 19, 2022
5187785
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 19, 2022
756ca36
fix button spacing
marktnoonan Oct 19, 2022
040020f
add e2e tests for record run modal
marktnoonan Oct 20, 2022
22f99b4
clean up some comments
marktnoonan Oct 20, 2022
cb20aff
only render banner if cohort is populated, remove double ref & unref
marktnoonan Oct 20, 2022
d8b8400
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 20, 2022
4b1cdd7
move usePrompt manager, update imports
marktnoonan Oct 20, 2022
aec9c69
Merge branch 'mark-and-stokes/login-modals' of https://github.com/cyp…
marktnoonan Oct 20, 2022
996780d
fix tooltip utm medium text
marktnoonan Oct 20, 2022
c1d2972
remove defaultTimeout change
marktnoonan Oct 20, 2022
a9b4bd4
clean up
marktnoonan Oct 20, 2022
b1e86df
move cohort composable to gql-components
marktnoonan Oct 21, 2022
a86207d
adjust for cohort option being a live ref
marktnoonan Oct 21, 2022
0bcd57f
fix ts
marktnoonan Oct 21, 2022
240bffa
fix nesting
marktnoonan Oct 21, 2022
a599509
simplify watch
marktnoonan Oct 21, 2022
8743552
implement PR feedback about refs
marktnoonan Oct 21, 2022
8459c72
improve comment
marktnoonan Oct 21, 2022
df66e9c
Merge branch 'develop' into mark-and-stokes/login-modals
marktnoonan Oct 21, 2022
8670967
fix state in state, add assertions based on percy
marktnoonan Oct 21, 2022
4f1b2c2
add unit tests for Local Settings Actions
marktnoonan Oct 22, 2022
b24e81f
allow isProjectConnected flag to reset to false if users is logged out
marktnoonan Oct 22, 2022
2e3b5a0
schema update
marktnoonan Oct 23, 2022
03a0c3c
use packages alias in paths
marktnoonan Oct 23, 2022
ca789db
update comment
marktnoonan Oct 24, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .vscode/cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"topnav",
"unconfigured",
"unplugin",
"unref",
"unrunnable",
"unstaged",
"urql",
Expand All @@ -48,4 +49,4 @@
],
"ignoreWords": [],
"import": []
}
}
7 changes: 4 additions & 3 deletions graphql-codegen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ vueOperations: &vueOperations
- 'typescript-operations'
- 'typed-document-node':
# Intentionally specified under typed-document-node rather than top level config,
# becuase we don't want it flattening the types for the operations
# because we don't want it flattening the types for the operations
flattenGeneratedTypes: true

vueTesting: &vueTesting
Expand Down Expand Up @@ -122,9 +122,10 @@ generates:
'./packages/app/src/generated/graphql-test.ts':
documents:
- './packages/app/src/**/*.{vue,ts,tsx,js,jsx}'
- './packages/frontend-shared/src/**/*.{vue,ts,tsx,js,jsx}'
- './packages/frontend-shared/src/gql-components/**/*.{vue,ts,tsx,js,jsx}'
<<: *vueTesting

'./packages/frontend-shared/src/generated/graphql-test.ts':
documents: './packages/frontend-shared/src/gql-components/**/*.{vue,ts,tsx,js,jsx}'
documents:
- './packages/frontend-shared/src/gql-components/**/*.{vue,ts,tsx,js,jsx}'
ZachJW34 marked this conversation as resolved.
Show resolved Hide resolved
<<: *vueTesting
48 changes: 30 additions & 18 deletions packages/app/cypress/e2e/runs.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
obj.result.data.cloudViewer.organizations.nodes = []
}

if (obj.result.data?.cloudViewer?.firstOrganization?.nodes) {
obj.result.data.cloudViewer.firstOrganization.nodes = []
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know that the need for firstOrganization was introduced in previous work, but I hope we can take some more time soon to find out why we have to rely on this trick while we also have the organizations being returned at the same time.

}

return obj.result
})

Expand Down Expand Up @@ -150,8 +154,14 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
cy.startAppServer('component')

cy.remoteGraphQLIntercept(async (obj) => {
if (obj?.result?.data?.cloudViewer?.organizations?.nodes) {
obj.result.data.cloudViewer.organizations.nodes = []
if ((obj.operationName !== 'CreateCloudOrgModal_CloudOrganizationsCheck_refreshOrganizations_cloudViewer')) {
if (obj.result.data?.cloudViewer?.organizations?.nodes) {
obj.result.data.cloudViewer.organizations.nodes = []
}

if (obj.result.data?.cloudViewer?.firstOrganization?.nodes) {
obj.result.data.cloudViewer.firstOrganization.nodes = []
}
}

return obj.result
Expand Down Expand Up @@ -181,7 +191,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
cy.startAppServer('component')

cy.remoteGraphQLIntercept(async (obj, testState) => {
if (obj.operationName === 'CloudConnectModals_RefreshCloudViewer_refreshCloudViewer_cloudViewer') {
if (obj.operationName === 'LoginConnectModals_LoginConnectModalsQuery_cloudViewer') {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change was just updating existing code, but looking at the rest of the code base, this spec file is the only place that there is conditional logic based on operationName. This is a fragile pattern to have look at this string. This is definitely a code smell to me but I have not looked at what the alternative would be yet.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These mutation names do get into a lot of places, and since their naming convention depends on our component architecture, we end up expressing that architecture in our tests, which yeah does feel a bit off, but also not a huge burden in practice imo, since we rarely change the architecture.

testState.refetchCalled = true
}

Expand Down Expand Up @@ -312,7 +322,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {

moveToRunsPage()
cy.findByText(defaultMessages.runs.connect.buttonProject).click()
cy.get('button').contains(defaultMessages.runs.connect.modal.selectProject.createProject).click()
cy.contains('button', defaultMessages.runs.connect.modal.selectProject.createProject).click()
cy.findByText(defaultMessages.runs.connectSuccessAlert.title).should('be.visible')

cy.withCtx(async (ctx) => {
Expand Down Expand Up @@ -351,7 +361,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {

cy.get('[href="#/runs"]').click()
cy.findByText(defaultMessages.runs.connect.buttonProject).click()
cy.get('button').contains(defaultMessages.runs.connect.modal.selectProject.createProject).click()
cy.contains('button', defaultMessages.runs.connect.modal.selectProject.createProject).click()

cy.get('[data-cy="alert"]').within(() => {
cy.contains(defaultMessages.runs.connect.errors.baseError.title)
Expand Down Expand Up @@ -386,7 +396,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {

cy.get('[href="#/runs"]').click()
cy.findByText(defaultMessages.runs.connect.buttonProject).click()
cy.get('button').contains(defaultMessages.runs.connect.modal.selectProject.createProject).click()
cy.contains('button', defaultMessages.runs.connect.modal.selectProject.createProject).click()

cy.get('[data-cy="alert"]').within(() => {
cy.contains(defaultMessages.runs.connect.errors.internalServerError.title)
Expand Down Expand Up @@ -417,7 +427,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
}

if (obj.result.data?.cloudViewer?.organizations?.nodes) {
const projectNodes = obj.result.data?.cloudViewer.organizations.nodes[0].projects.nodes
const projectNodes = obj.result.data.cloudViewer.organizations.nodes[0].projects.nodes

projectNodes.push({
__typename: 'CloudProject',
Expand All @@ -440,9 +450,10 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
})

it('opens Connect Project modal after clicking Reconnect Project button', () => {
cy.findByText(defaultMessages.runs.errors.notFound.button).should('be.visible').click()
cy.findByText(defaultMessages.runs.errors.notFound.button).click()

cy.get('[aria-modal="true"]').should('exist')
cy.get('[data-cy="selectProject"] button').should('have.text', 'Mock Project')
cy.contains('[data-cy="selectProject"] button', 'Mock Project')
cy.get('[data-cy="connect-project"]').click()
cy.get('[data-cy="runs"]', { timeout: 7500 })
})
Expand Down Expand Up @@ -510,12 +521,13 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {

it('updates the button text when the request access button is clicked', () => {
cy.remoteGraphQLIntercept(async (obj, testState) => {
if (obj.operationName === 'Runs_currentProject_cloudProject_cloudProjectBySlug') {
if (obj.operationName?.includes('cloudProject_cloudProjectBySlug')) {
const proj = obj!.result!.data!.cloudProjectBySlug

proj.__typename = 'CloudProjectUnauthorized'
proj.message = 'Cloud Project Unauthorized'
proj.hasRequestedAccess = false

testState.project = proj
} else if (obj.operationName === 'RunsErrorRenderer_RequestAccess_cloudProjectRequestAccess') {
obj!.result!.data!.cloudProjectRequestAccess = {
Expand Down Expand Up @@ -696,7 +708,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {

cy.loginUser()
cy.remoteGraphQLIntercept((obj) => {
if (obj.operationName === 'Runs_currentProject_cloudProject_cloudProjectBySlug') {
if (obj.operationName?.includes('cloudProject_cloudProjectBySlug')) {
cloudData = obj.result
obj.result = {}

Expand All @@ -714,7 +726,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
// cy.percySnapshot() // TODO: restore when Percy CSS is fixed. See https://github.com/cypress-io/cypress/issues/23435

cy.remoteGraphQLIntercept((obj) => {
if (obj.operationName === 'Runs_currentProject_cloudProject_cloudProjectBySlug') {
if (obj.operationName?.includes('cloudProject_cloudProjectBySlug')) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then changes in these intercepts let them behave correctly now that more than just the Runs component is using them - don't need a strict match on full operation name

return cloudData
}

Expand All @@ -732,10 +744,6 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
cy.startAppServer('component')
})

afterEach(() => {
cy.goOnline()
})

it('shows alert warning if runs have been returned already', () => {
cy.loginUser()
cy.visitApp()
Expand Down Expand Up @@ -773,11 +781,15 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
cy.openProject('component-tests', ['--config-file', 'cypressWithoutProjectId.config.js'])
cy.startAppServer('component')

cy.remoteGraphQLIntercept(async (obj) => {
cy.remoteGraphQLIntercept((obj) => {
if (obj.result.data?.cloudViewer?.organizations?.nodes) {
obj.result.data.cloudViewer.organizations.nodes = []
}

if (obj.result.data?.cloudViewer?.firstOrganization?.nodes) {
obj.result.data.cloudViewer.firstOrganization.nodes = []
}

return obj.result
})

Expand Down Expand Up @@ -845,7 +857,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
cy.openProject('component-tests')
cy.startAppServer('component')
cy.loginUser()
cy.remoteGraphQLIntercept((obj, testState) => {
cy.remoteGraphQLIntercept((obj) => {
if (obj.result.data?.cloudProjectBySlug?.runs?.nodes.length) {
obj.result.data.cloudProjectBySlug.runs.nodes.map((run) => {
run.status = 'RUNNING'
Expand Down
6 changes: 1 addition & 5 deletions packages/app/cypress/e2e/specs_list_latest_runs.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW
})

context('when no runs are recorded', () => {
beforeEach(() => {
it('shows placeholders for all visible specs', { defaultCommandTimeout: 6000 }, () => {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test was flaky for me, some minor changes in this file to address that.

cy.loginUser()

cy.remoteGraphQLIntercept(async (obj) => {
Expand All @@ -181,10 +181,6 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW
})

cy.visitApp()
cy.findByTestId('sidebar-link-specs-page').click()
})

it('shows placeholders for all visible specs', () => {
allVisibleSpecsShouldBePlaceholders()
})
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import defaultMessages from '@packages/frontend-shared/src/locales/en-US.json'
import type { SinonStub } from 'sinon'

describe('App: Runs', { viewportWidth: 1200 }, () => {
describe('CreateCloudOrgModalSubscription', { viewportWidth: 1200 }, () => {
beforeEach(() => {
cy.scaffoldProject('component-tests')
cy.openProject('component-tests')
Expand All @@ -22,6 +22,10 @@ describe('App: Runs', { viewportWidth: 1200 }, () => {
obj.result.data.cloudViewer.organizations.nodes = []
}

if (obj.result.data?.cloudViewer?.firstOrganization?.nodes) {
obj.result.data.cloudViewer.firstOrganization.nodes = []
}

return obj.result
})

Expand Down
29 changes: 29 additions & 0 deletions packages/app/cypress/e2e/top-nav.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,17 @@ describe('App Top Nav Workflows', () => {
cy.openProject('component-tests', ['--config-file', 'cypressWithoutProjectId.config.js'])
cy.startAppServer()
cy.visitApp()
cy.remoteGraphQLIntercept(async (obj) => {
if (obj.result.data?.cloudViewer) {
obj.result.data.cloudViewer.organizations = {
__typename: 'CloudOrganizationConnection',
id: 'test',
nodes: [{ __typename: 'CloudOrganization', id: '987' }],
}
}

return obj.result
})

mockLogInActionsForUser(mockUser)
logIn({ expectedNextStepText: 'Connect project', displayName: mockUser.name })
Expand Down Expand Up @@ -494,6 +505,24 @@ describe('App Top Nav Workflows', () => {
cy.findByTestId('app-header-bar').findByTestId('user-avatar-title').should('be.visible')
})

it('if the project has no runs, shows "record your first run" prompt after clicking', () => {
cy.remoteGraphQLIntercept((obj) => {
if (obj.result?.data?.cloudProjectBySlug?.runs?.nodes?.length) {
obj.result.data.cloudProjectBySlug.runs.nodes = []
}

return obj.result
})

mockLogInActionsForUser(mockUserNoName)

logIn({ expectedNextStepText: 'Continue', displayName: mockUserNoName.email })

cy.contains('[data-cy=standard-modal] h2', defaultMessages.specPage.banners.record.title).should('be.visible')
cy.contains('[data-cy=standard-modal]', defaultMessages.specPage.banners.record.content).should('be.visible')
cy.contains('button', 'Copy').should('be.visible')
})

it('shows correct error when browser cannot launch', () => {
cy.withCtx((ctx, o) => {
o.sinon.stub(ctx._apis.authApi, 'logIn').callsFake(async (onMessage) => {
Expand Down
20 changes: 19 additions & 1 deletion packages/app/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,31 @@
:is="Component"
/>
</router-view>

<template v-if="route.name && route.name !== 'SpecRunner'">
<!--
checking for existence of `route.name` here to avoid a flash
of these components if the page is refreshed on the SpecRunner route
-->
<CloudViewerAndProject />
<LoginConnectModals />
</template>
</template>

<script setup lang="ts">
import LoginConnectModals from '@cy/gql-components/LoginConnectModals.vue'

import { useRoute } from 'vue-router'
import CloudViewerAndProject from '../../frontend-shared/src/gql-components/CloudViewerAndProject.vue'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Standardize on frontend-shared import? We wither use @packages/frontend-shared or relative import or @cy/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I can standardize the ones in this PR at least, we are pretty inconsistent.

const route = useRoute()

</script>

<style lang="scss">
html,
body,
#app {
@apply h-full bg-white;
@apply bg-white h-full;
}

@font-face {
Expand Down
32 changes: 2 additions & 30 deletions packages/app/src/layouts/default.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,12 @@
v-if="renderSidebar"
class="row-span-full"
/>

<HeaderBar
v-if="showHeader"
:show-browsers="true"
:page-name="currentRoute.name?.toString()"
data-cy="app-header-bar"
:allow-automatic-prompt-open="true"
@connect-project="handleConnectProject"
/>
<div
v-if="query.data.value?.baseError || query.data.value?.currentProject?.isLoadingConfigFile || query.data.value?.currentProject?.isLoadingNodeEvents"
Expand Down Expand Up @@ -49,16 +47,6 @@
<component :is="Component" />
</transition>
</router-view>
<!-- "Nav" is the correct UTM medium below because
this is only opened by event emitted from the header bar-->
<CloudConnectModals
v-if="showConnectDialog && cloudModalQuery.data.value"
:show="showConnectDialog"
:gql="cloudModalQuery.data.value"
utm-medium="Nav"
@cancel="showConnectDialog = false"
@success="showConnectDialog = false"
/>
</main>
</div>
</template>
Expand All @@ -69,12 +57,11 @@ import SidebarNavigation from '../navigation/SidebarNavigation.vue'
import HeaderBar from '@cy/gql-components/HeaderBar.vue'
import BaseError from '@cy/gql-components/error/BaseError.vue'
import Spinner from '@cy/components/Spinner.vue'
import CloudConnectModals from '../runs/modals/CloudConnectModals.vue'

import { useRoute } from 'vue-router'
import { computed, ref } from 'vue'
import { computed } from 'vue'

import { MainApp_CloudConnectModalsQueryDocument, MainAppQueryDocument, MainApp_ResetErrorsAndLoadConfigDocument } from '../generated/graphql'
import { MainAppQueryDocument, MainApp_ResetErrorsAndLoadConfigDocument } from '../generated/graphql'

gql`
fragment MainAppQueryData on Query {
Expand All @@ -96,12 +83,6 @@ query MainAppQuery {
}
`

gql`
query MainApp_CloudConnectModalsQuery {
...CloudConnectModals
}
`

gql`
mutation MainApp_ResetErrorsAndLoadConfig($id: ID!) {
resetErrorAndLoadConfig(id: $id) {
Expand All @@ -110,10 +91,6 @@ mutation MainApp_ResetErrorsAndLoadConfig($id: ID!) {
}
`

const showConnectDialog = ref(false)

const cloudModalQuery = useQuery({ query: MainApp_CloudConnectModalsQueryDocument, pause: true })

const currentRoute = useRoute()

const showHeader = computed(() => {
Expand All @@ -134,9 +111,4 @@ const resetErrorAndLoadConfig = (id: string) => {

const renderSidebar = window.__CYPRESS_MODE__ !== 'run'

async function handleConnectProject () {
await cloudModalQuery.executeQuery()
showConnectDialog.value = true
}

</script>
Loading