From 06783424c2c495679fa58db31643200490ad30a7 Mon Sep 17 00:00:00 2001 From: Stokes Player Date: Tue, 22 Nov 2022 20:48:55 -0500 Subject: [PATCH 01/22] adding debug page --- packages/app/package.json | 2 +- .../app/src/navigation/SidebarNavigation.vue | 2 ++ .../navigation/SidebarNavigationRow.cy.tsx | 2 ++ packages/app/src/pages/Debug.vue | 7 ++++++ yarn.lock | 22 +++++++++---------- 5 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 packages/app/src/pages/Debug.vue diff --git a/packages/app/package.json b/packages/app/package.json index 0d83a0a21ca3..96eeb61c8f7a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -20,7 +20,7 @@ }, "dependencies": {}, "devDependencies": { - "@cypress-design/vue-icon": "^0.4.2", + "@cypress-design/vue-icon": "^0.12.1", "@graphql-typed-document-node/core": "^3.1.0", "@headlessui/vue": "1.4.0", "@iconify/iconify": "2.1.2", diff --git a/packages/app/src/navigation/SidebarNavigation.vue b/packages/app/src/navigation/SidebarNavigation.vue index 0814af41bd76..a27c000505c2 100644 --- a/packages/app/src/navigation/SidebarNavigation.vue +++ b/packages/app/src/navigation/SidebarNavigation.vue @@ -94,6 +94,7 @@ import { gql, useMutation, useQuery } from '@urql/vue' import SidebarNavigationRow from './SidebarNavigationRow.vue' import KeyboardBindingsModal from './KeyboardBindingsModal.vue' import { + IconStatusFailedOutline, // not available in size 24 IconTechnologyCodeEditor, IconTechnologyTestResults, IconObjectGear, @@ -112,6 +113,7 @@ const { t } = useI18n() const navigation = [ { name: 'Specs', icon: IconTechnologyCodeEditor, href: '/specs' }, { name: 'Runs', icon: IconTechnologyTestResults, href: '/runs' }, + { name: 'Debug', icon: IconStatusFailedOutline, href: '/debug' }, { name: 'Settings', icon: IconObjectGear, href: '/settings' }, ] as const diff --git a/packages/app/src/navigation/SidebarNavigationRow.cy.tsx b/packages/app/src/navigation/SidebarNavigationRow.cy.tsx index 58a10769d15e..c9bea2ec8f2b 100644 --- a/packages/app/src/navigation/SidebarNavigationRow.cy.tsx +++ b/packages/app/src/navigation/SidebarNavigationRow.cy.tsx @@ -1,5 +1,6 @@ import SidebarNavigationRow from './SidebarNavigationRow.vue' import { + IconStatusFailedOutline, IconTechnologyCodeEditor, IconTechnologyTestResults, IconObjectGear, @@ -14,6 +15,7 @@ describe('SidebarNavigationRow', () => { >

Tab Style

+ diff --git a/packages/app/src/pages/Debug.vue b/packages/app/src/pages/Debug.vue new file mode 100644 index 000000000000..7a5bc4a700d8 --- /dev/null +++ b/packages/app/src/pages/Debug.vue @@ -0,0 +1,7 @@ + + + diff --git a/yarn.lock b/yarn.lock index 684bbf3d4afb..63faa3851f4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2326,19 +2326,17 @@ windicss "^3.5.1" windicss-webpack-plugin "^1.6.10" -"@cypress-design/icon-registry@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@cypress-design/icon-registry/-/icon-registry-0.4.2.tgz#bc2d913208acb33b5dfb1d8f6d7929b153e32ba0" - integrity sha512-iyH5xFc2abpwVPTEjoJ2ILIQy79DaR6ata76HAk9NHPWVUwG/yUPEzvp3m2T8IqgebNEuTtl4mBHM/u+jycxng== - dependencies: - camelcase "^6.3.0" +"@cypress-design/icon-registry@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@cypress-design/icon-registry/-/icon-registry-0.14.0.tgz#c30cbb013b7a86700941677da661229d81493399" + integrity sha512-wIXr00J7azl8Jl+3DLhSK8WkWXRUvfqDKUnLrEyxQjrzbwNIQIPL0bqgY30CZbx8xoPXCIewJDYXvhgbWZQOhQ== -"@cypress-design/vue-icon@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@cypress-design/vue-icon/-/vue-icon-0.4.2.tgz#3574a749efbdaf83f48251108c016c3d383160bd" - integrity sha512-i7YWizC/c1LFdxVZSbyTIOrj4LeiIxypemCXdygacmvogQS2buBC+CovqCMFAzKqnfBZUBGiQajMWWM5rzIduw== +"@cypress-design/vue-icon@^0.12.1": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@cypress-design/vue-icon/-/vue-icon-0.12.1.tgz#cb348fb697dd65305c927522643b4ede6b113821" + integrity sha512-AI5XUqzL9AwoNL0rvQNWzyrP5WQNGYPI2phC7b0MhO7hjrZN6Qv+Le7kHhEpAIpWuVi222t699jlvXoTRNr1Jw== dependencies: - "@cypress-design/icon-registry" "^0.4.2" + "@cypress-design/icon-registry" "^0.14.0" "@cypress/commit-info@2.2.0": version "2.2.0" @@ -11571,7 +11569,7 @@ camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.3.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== From 7215efd1adc3ae4afdfc125922678245d94b38f0 Mon Sep 17 00:00:00 2001 From: Stokes Player Date: Wed, 23 Nov 2022 08:21:22 -0500 Subject: [PATCH 02/22] Fixing sidebar e2e tests --- packages/app/cypress/e2e/sidebar_navigation.cy.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/app/cypress/e2e/sidebar_navigation.cy.ts b/packages/app/cypress/e2e/sidebar_navigation.cy.ts index 48d791221fb6..f21c566f4a92 100644 --- a/packages/app/cypress/e2e/sidebar_navigation.cy.ts +++ b/packages/app/cypress/e2e/sidebar_navigation.cy.ts @@ -16,6 +16,7 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { .tab().should('have.attr', 'data-cy', 'sidebar-header').should('have.attr', 'role', 'button') .tab().should('have.attr', 'href', '#/specs').should('have.prop', 'tagName', 'A') .tab().should('have.attr', 'href', '#/runs').should('have.prop', 'tagName', 'A') + .tab().should('have.attr', 'href', '#/debug').should('have.prop', 'tagName', 'A') .tab().should('have.attr', 'href', '#/settings').should('have.prop', 'tagName', 'A') .tab().should('have.attr', 'data-cy', 'keyboard-modal-trigger').should('have.prop', 'tagName', 'BUTTON') }) @@ -146,6 +147,10 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { cy.contains('.v-popper--some-open--tooltip', 'Specs') cy.findByTestId('sidebar-link-specs-page').trigger('mouseout') + cy.findByTestId('sidebar-link-debug-page').trigger('mouseenter') + cy.contains('.v-popper--some-open--tooltip', 'Debug') + cy.findByTestId('sidebar-link-debug-page').trigger('mouseout') + cy.findByTestId('sidebar-link-settings-page').trigger('mouseenter') cy.contains('.v-popper--some-open--tooltip', 'Settings') cy.findByTestId('sidebar-link-settings-page').trigger('mouseout') @@ -237,6 +242,14 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { cy.get('.router-link-active').findByText('Specs').should('be.visible') }) + it('has a menu item labeled "Debug" which takes you to the Debug page', () => { + cy.get('[data-cy="app-header-bar"]').findByText('Debug').should('not.exist') + + cy.findByTestId('sidebar-link-debug-page').should('have.text', 'Debug').should('be.visible').click() + cy.get('[data-cy="app-header-bar"]').findByText('Debug').should('be.visible') + cy.get('.router-link-active').findByText('Debug').should('be.visible') + }) + it('Specs sidebar nav link is not active when a test is running', () => { cy.location('hash').should('equal', '#/specs') cy.contains('.router-link-exact-active', 'Specs') From 02e23a365eb409fdd9c4eeffc8d6c7280ec917ad Mon Sep 17 00:00:00 2001 From: Stokes Player Date: Thu, 1 Dec 2022 10:06:13 -0500 Subject: [PATCH 03/22] Adding more content to the Debug page and header updates --- packages/app/src/debug/DebugContainer.cy.tsx | 52 ++++ packages/app/src/debug/DebugContainer.vue | 94 ++++++ packages/app/src/debug/DebugPageHeader.cy.tsx | 5 +- packages/app/src/debug/DebugPageHeader.vue | 50 +-- packages/app/src/debug/DebugSpecList.vue | 37 +++ packages/app/src/pages/Debug.vue | 24 +- .../frontend-shared/src/locales/en-US.json | 8 + packages/graphql/schemas/cloud.graphql | 294 +++++++++++++++++- packages/graphql/schemas/schema.graphql | 222 ++++++++++++- 9 files changed, 755 insertions(+), 31 deletions(-) create mode 100644 packages/app/src/debug/DebugContainer.cy.tsx create mode 100644 packages/app/src/debug/DebugContainer.vue create mode 100644 packages/app/src/debug/DebugSpecList.vue diff --git a/packages/app/src/debug/DebugContainer.cy.tsx b/packages/app/src/debug/DebugContainer.cy.tsx new file mode 100644 index 000000000000..4e17961d796b --- /dev/null +++ b/packages/app/src/debug/DebugContainer.cy.tsx @@ -0,0 +1,52 @@ +import { DebugSpecsFragmentDoc } from '../generated/graphql-test' +import DebugContainer from './DebugContainer.vue' +import { defaultMessages } from '@cy/i18n' +import { useLoginConnectStore } from '@packages/frontend-shared/src/store/login-connect-store' + +describe('', () => { + context('empty states', () => { + const validateEmptyState = (expectedMessage: string) => { + cy.mountFragment(DebugSpecsFragmentDoc, { + render: (gqlVal) => { + return ( + + ) + }, + }) + + cy.findByTestId('debug-empty').contains(expectedMessage) + } + + it('shows not logged in', () => { + validateEmptyState(defaultMessages.debugPage.notLoggedIn) + }) + + it('is logged in', () => { + const loginConnectStore = useLoginConnectStore() + + loginConnectStore.setUserFlag('isLoggedIn', true) + + validateEmptyState(defaultMessages.debugPage.notConnected) + }) + + it('has no runs', () => { + const loginConnectStore = useLoginConnectStore() + + loginConnectStore.setUserFlag('isLoggedIn', true) + loginConnectStore.setProjectFlag('isProjectConnected', true) + cy.mountFragment(DebugSpecsFragmentDoc, { + render: (gqlVal) => { + return ( + + ) + }, + }) + + cy.findByTestId('debug-empty').contains(defaultMessages.debugPage.noRuns) + }) + }) +}) diff --git a/packages/app/src/debug/DebugContainer.vue b/packages/app/src/debug/DebugContainer.vue new file mode 100644 index 000000000000..36cf9087d78f --- /dev/null +++ b/packages/app/src/debug/DebugContainer.vue @@ -0,0 +1,94 @@ + + + diff --git a/packages/app/src/debug/DebugPageHeader.cy.tsx b/packages/app/src/debug/DebugPageHeader.cy.tsx index 14ebb3bb5edd..8a34d5f83434 100644 --- a/packages/app/src/debug/DebugPageHeader.cy.tsx +++ b/packages/app/src/debug/DebugPageHeader.cy.tsx @@ -20,12 +20,13 @@ describe('', { result.commitInfo.summary = 'Adding a hover state to the button component' result.commitInfo.branch = 'feature/DESIGN-183' result.commitInfo.authorName = 'cypressDTest' + result.commitInfo.sha = 'b5e6fde' } } }, render: (gqlVal) => { return ( - + ) }, }) @@ -36,7 +37,7 @@ describe('', { cy.findByTestId('debug-runCommit-info').children().should('have.length', 3) cy.findByTestId('debug-runNumber') - .should('have.text', ' Run #468') + .should('have.text', ' Run #432') .should('have.css', 'color', 'rgb(90, 95, 122)') cy.findByTestId('debug-commitsAhead') diff --git a/packages/app/src/debug/DebugPageHeader.vue b/packages/app/src/debug/DebugPageHeader.vue index f84e9e667612..65a335d9f418 100644 --- a/packages/app/src/debug/DebugPageHeader.vue +++ b/packages/app/src/debug/DebugPageHeader.vue @@ -4,12 +4,12 @@ class="flex flex-col pb-24px gap-16px" >
  • - Run #{{ props.runNumber }} + Run #{{ debug.runNumber }} -
    +
    {{ props.commitsAhead }} @@ -46,13 +46,13 @@ :href="debug.url || '#'" :use-default-hocus="false" > - Dashboard Link: View in the dashboard + Dashboard Link: {{ t('debugPage.header.runUrl') }}
  • - + Branch Name: {{ debug.commitInfo.branch }}
  • - Commit Hash: {{ props.commitHash }} + Commit Hash: {{ debug.commitInfo?.sha?.substring(0,7) }}
  • Commit Author: {{ debug.commitInfo.authorName }} @@ -97,7 +97,7 @@ stroke-color="gray-500" fill-color="gray-50" /> - Run Total Duration: {{ debug.totalDuration }} ({{ relativeCreatedAt }}) + Run Total Duration: {{ totalDuration }} ({{ relativeCreatedAt }})
@@ -112,23 +112,24 @@ import CommitIcon from '~icons/cy/commit_x14' import { IconTimeStopwatch } from '@cypress-design/vue-icon' import { gql } from '@urql/core' import { dayjs } from '../runs/utils/day.js' +import { useI18n } from 'vue-i18n' + +const { t } = useI18n() -// runNumber and commitHash dont currently exist in the query and therefore are being obtained as props instead gql` fragment DebugPage on CloudRun { id + runNumber createdAt status totalDuration - url - tags { - id - name + commitInfo { + sha } + url ...RunResults commitInfo { authorName - authorEmail summary branch } @@ -138,13 +139,12 @@ fragment DebugPage on CloudRun { const props = defineProps<{ gql: DebugPageFragment commitsAhead: string - commitHash: string - runNumber: number }>() const debug = computed(() => props.gql) const relativeCreatedAt = computed(() => dayjs(new Date(debug.value.createdAt!)).fromNow()) +const totalDuration = computed(() => dayjs.duration(debug.value.totalDuration!).format('HH:mm:ss').replace(/^0+:/, ''))