From 1863f794bcf5b075a1c7f1fe2282c5e684f3d32a Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Sat, 4 Nov 2023 13:04:32 +1100 Subject: [PATCH 1/8] add redirect from get started --- .../src/api/runGetStartedPage.ts | 18 ++++++++++++++++++ .../JenkinsServerList/JenkinsServerList.tsx | 2 ++ app/manifest.yml | 17 +++++++++++++++++ app/src/index.ts | 12 +++++++++++- app/src/resolvers.ts | 6 ++++++ app/src/storage/run-as-get-started.ts | 17 +++++++++++++++++ 6 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts create mode 100644 app/src/storage/run-as-get-started.ts diff --git a/app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts b/app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts new file mode 100644 index 00000000..17ca11f2 --- /dev/null +++ b/app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts @@ -0,0 +1,18 @@ +import { invoke, router } from '@forge/bridge'; + +interface Context { + siteUrl: string; + appId: string; + environmentId: string; +} + +const runGetStartedPage = async () => { + const context: Context = await invoke('runGetStartedPage'); + const { siteUrl, appId, environmentId } = context; + console.log('NAVIGATING TO HOME PAGE'); + router.navigate(`${siteUrl}/jira/settings/apps/${appId}/${environmentId}/`); +}; + +export { + runGetStartedPage +}; diff --git a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx index e89c1d14..656d84fe 100644 --- a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx +++ b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx @@ -8,6 +8,7 @@ import { ConnectedServers } from './ConnectedServer/ConnectedServers'; import { StyledDescription, headerContainer } from './JenkinsServerList.styles'; import { spinnerHeight } from '../../common/styles/spinner.styles'; import { getAllJenkinsServers } from '../../api/getAllJenkinsServers'; +import { runGetStartedPage } from '../../api/runGetStartedPage'; import { JenkinsServer } from '../../../../src/common/types'; import { JenkinsSpinner } from '../JenkinsSpinner/JenkinsSpinner'; import { AnalyticsClient } from '../../common/analytics/analytics-client'; @@ -23,6 +24,7 @@ const JenkinsServerList = (): JSX.Element => { const [jenkinsServers, setJenkinsServers] = useState(); const fetchAllJenkinsServers = async () => { const servers = await getAllJenkinsServers() || []; + await runGetStartedPage(); setJenkinsServers(servers); }; diff --git a/app/manifest.yml b/app/manifest.yml index 42530da2..16786b07 100644 --- a/app/manifest.yml +++ b/app/manifest.yml @@ -7,35 +7,52 @@ modules: title: Jenkins for Jira layout: basic icon: https://marketplace-cdn.atlassian.com/files/0c45cd96-ccf1-4490-9df4-307dded2f6e0?fileType=image&mode=full-fit + + - key: get-started-page + resource: main + resolver: + function: runGetStartedPage + title: Jenkins for Jira + layout: basic + icon: https://marketplace-cdn.atlassian.com/files/0c45cd96-ccf1-4490-9df4-307dded2f6e0?fileType=image&mode=full-fit + useAsGetStarted: true + webtrigger: - key: jenkins-webtrigger function: handle-jenkins-request - key: reset-jenkins-webtrigger function: reset-jenkins-request + devops:deploymentInfoProvider: - key: deployment-info-provider homeUrl: https://github.com/jenkinsci/atlassian-jira-software-cloud-plugin logoUrl: https://marketplace-cdn.atlassian.com/files/0c45cd96-ccf1-4490-9df4-307dded2f6e0?fileType=image&mode=full-fit name: value: Jenkins for Jira + devops:buildInfoProvider: - key: build-info-provider homeUrl: https://github.com/jenkinsci/atlassian-jira-software-cloud-plugin logoUrl: https://marketplace-cdn.atlassian.com/files/0c45cd96-ccf1-4490-9df4-307dded2f6e0?fileType=image&mode=full-fit name: value: Jenkins for Jira + function: - key: resolver handler: index.resolver + - key: runGetStartedPage + handler: index.runGetStartedPage - key: handle-jenkins-request handler: index.handleJenkinsRequest - key: reset-jenkins-request handler: index.handleResetJenkinsRequest + resources: - key: main path: jenkins-for-jira-ui/build tunnel: port: 3000 + app: id: ari:cloud:ecosystem::app/df76f661-4cbe-4768-a119-13992dc4ce2d # This is caused by a forge bug related to deserialising externally allocated memory. TODO: Remove when fix comes out diff --git a/app/src/index.ts b/app/src/index.ts index a3611786..762fb65d 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -1,9 +1,19 @@ import resolver from './resolvers'; +import { runGetStartedPage } from './storage/run-as-get-started'; import handleJenkinsRequest from './webtrigger/handle-jenkins-request'; import { handleResetJenkinsRequest } from './webtrigger/handle-reset-jenkins-request'; +// import { WebtriggerRequest } from './webtrigger/types'; + +// const runGetStartedPage = ( +// request: WebtriggerRequest +// ) => { +// const { siteUrl, environmentId } = request.context; +// const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; +// return { siteUrl, appId, environmentId }; +// }; // webtriggers export { handleJenkinsRequest, handleResetJenkinsRequest }; // resolvers -export { resolver }; +export { resolver, runGetStartedPage }; diff --git a/app/src/resolvers.ts b/app/src/resolvers.ts index 8973e341..326281c1 100644 --- a/app/src/resolvers.ts +++ b/app/src/resolvers.ts @@ -12,6 +12,7 @@ import { deleteDeployments } from './jira-client/delete-deployments'; import { adminPermissionCheck } from './check-permissions'; import { metricResolverEmitter } from './common/metric-names'; import { generateNewSecret } from './storage/generate-new-secret'; +import { RunAsGetStarted, runGetStartedPage } from './storage/run-as-get-started'; const resolver = new Resolver(); @@ -73,4 +74,9 @@ resolver.define('fetchCloudId', async (req): Promise => { return req.context.cloudId; }); +resolver.define('runGetStartedPage', async (req): Promise => { + await adminPermissionCheck(req); + return runGetStartedPage(req); +}); + export default resolver.getDefinitions(); diff --git a/app/src/storage/run-as-get-started.ts b/app/src/storage/run-as-get-started.ts new file mode 100644 index 00000000..79c2e517 --- /dev/null +++ b/app/src/storage/run-as-get-started.ts @@ -0,0 +1,17 @@ +import {Logger} from "../config/logger"; + +export type RunAsGetStarted = { + siteUrl: string, + appId: string, + environmentId: string +}; + +const runGetStartedPage = (request: any): RunAsGetStarted => { + const logger = Logger.getInstance('runGetStartedPage'); + const { siteUrl, environmentId } = request.context; + const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; + logger.info('returning values for runGetStartedPage'); + return { siteUrl, appId, environmentId }; +}; + +export { runGetStartedPage }; From 19daf82157f977096f5faff0229df429e5d9b117 Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 10:28:10 +1100 Subject: [PATCH 2/8] debuggin deployment issue --- .../src/components/EmptyState/EmptyState.tsx | 4 ++-- .../src/components/JenkinsServerList/JenkinsServerList.tsx | 2 +- app/src/storage/run-as-get-started.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx b/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx index aeea8eb2..ae128d5e 100644 --- a/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx +++ b/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx @@ -53,10 +53,10 @@ const EmptyStateJenkins = () => { return ( onClickConnect()}> - Connect a Jenkins server + Connect a Jenkins server TEST } secondaryAction={ diff --git a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx index 656d84fe..c194ce94 100644 --- a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx +++ b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx @@ -76,7 +76,7 @@ const JenkinsServerList = (): JSX.Element => { ) : ( <>
- Jenkins configuration + Jenkins configuration TEST
diff --git a/app/src/storage/run-as-get-started.ts b/app/src/storage/run-as-get-started.ts index 79c2e517..41054087 100644 --- a/app/src/storage/run-as-get-started.ts +++ b/app/src/storage/run-as-get-started.ts @@ -1,4 +1,4 @@ -import {Logger} from "../config/logger"; +import { Logger } from '../config/logger'; export type RunAsGetStarted = { siteUrl: string, @@ -10,7 +10,7 @@ const runGetStartedPage = (request: any): RunAsGetStarted => { const logger = Logger.getInstance('runGetStartedPage'); const { siteUrl, environmentId } = request.context; const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; - logger.info('returning values for runGetStartedPage'); + logger.info('returning values for runGetStartedPage... testing deployment change'); return { siteUrl, appId, environmentId }; }; From 620f0e97dbcb901814bb5d8f893a8de58d4be507 Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 11:18:25 +1100 Subject: [PATCH 3/8] clean up changes --- ...{runGetStartedPage.ts => redirectFromGetStarted.ts} | 5 ++--- .../components/JenkinsServerList/JenkinsServerList.tsx | 10 +++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) rename app/jenkins-for-jira-ui/src/api/{runGetStartedPage.ts => redirectFromGetStarted.ts} (77%) diff --git a/app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts similarity index 77% rename from app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts rename to app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts index 17ca11f2..6a137855 100644 --- a/app/jenkins-for-jira-ui/src/api/runGetStartedPage.ts +++ b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts @@ -6,13 +6,12 @@ interface Context { environmentId: string; } -const runGetStartedPage = async () => { +const redirectFromGetStarted = async () => { const context: Context = await invoke('runGetStartedPage'); const { siteUrl, appId, environmentId } = context; - console.log('NAVIGATING TO HOME PAGE'); router.navigate(`${siteUrl}/jira/settings/apps/${appId}/${environmentId}/`); }; export { - runGetStartedPage + redirectFromGetStarted }; diff --git a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx index c194ce94..e577e5e3 100644 --- a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx +++ b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx @@ -8,7 +8,6 @@ import { ConnectedServers } from './ConnectedServer/ConnectedServers'; import { StyledDescription, headerContainer } from './JenkinsServerList.styles'; import { spinnerHeight } from '../../common/styles/spinner.styles'; import { getAllJenkinsServers } from '../../api/getAllJenkinsServers'; -import { runGetStartedPage } from '../../api/runGetStartedPage'; import { JenkinsServer } from '../../../../src/common/types'; import { JenkinsSpinner } from '../JenkinsSpinner/JenkinsSpinner'; import { AnalyticsClient } from '../../common/analytics/analytics-client'; @@ -17,6 +16,7 @@ import { AnalyticsScreenEventsEnum, AnalyticsUiEventsEnum } from '../../common/analytics/analytics-events'; +import { redirectFromGetStarted } from '../../api/redirectFromGetStarted'; const JenkinsServerList = (): JSX.Element => { const history = useHistory(); @@ -24,12 +24,16 @@ const JenkinsServerList = (): JSX.Element => { const [jenkinsServers, setJenkinsServers] = useState(); const fetchAllJenkinsServers = async () => { const servers = await getAllJenkinsServers() || []; - await runGetStartedPage(); setJenkinsServers(servers); }; + const redirectToAdminPage = async () => { + await redirectFromGetStarted(); + }; + useEffect(() => { fetchAllJenkinsServers(); + redirectToAdminPage(); }, []); if (!jenkinsServers) { @@ -76,7 +80,7 @@ const JenkinsServerList = (): JSX.Element => { ) : ( <>
- Jenkins configuration TEST + Jenkins configuration
From 87fc0cd3b1b80f1a40b9f9e0cd28f82fc40f0732 Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 11:26:54 +1100 Subject: [PATCH 4/8] clean up --- .../src/components/EmptyState/EmptyState.tsx | 4 ++-- app/manifest.yml | 6 +++--- app/src/common/metric-names.ts | 3 ++- app/src/index.ts | 13 ++----------- app/src/resolvers.ts | 7 ++++--- app/src/storage/run-as-get-started.ts | 17 ----------------- app/src/utils/redirect-from-get-started.ts | 13 +++++++++++++ 7 files changed, 26 insertions(+), 37 deletions(-) delete mode 100644 app/src/storage/run-as-get-started.ts create mode 100644 app/src/utils/redirect-from-get-started.ts diff --git a/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx b/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx index ae128d5e..aeea8eb2 100644 --- a/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx +++ b/app/jenkins-for-jira-ui/src/components/EmptyState/EmptyState.tsx @@ -53,10 +53,10 @@ const EmptyStateJenkins = () => { return ( onClickConnect()}> - Connect a Jenkins server TEST + Connect a Jenkins server } secondaryAction={ diff --git a/app/manifest.yml b/app/manifest.yml index 16786b07..67eba277 100644 --- a/app/manifest.yml +++ b/app/manifest.yml @@ -11,7 +11,7 @@ modules: - key: get-started-page resource: main resolver: - function: runGetStartedPage + function: redirectFromGetStarted title: Jenkins for Jira layout: basic icon: https://marketplace-cdn.atlassian.com/files/0c45cd96-ccf1-4490-9df4-307dded2f6e0?fileType=image&mode=full-fit @@ -40,8 +40,8 @@ modules: function: - key: resolver handler: index.resolver - - key: runGetStartedPage - handler: index.runGetStartedPage + - key: redirectFromGetStarted + handler: index.redirectFromGetStarted - key: handle-jenkins-request handler: index.handleJenkinsRequest - key: reset-jenkins-request diff --git a/app/src/common/metric-names.ts b/app/src/common/metric-names.ts index ae66ab8c..08f7306e 100644 --- a/app/src/common/metric-names.ts +++ b/app/src/common/metric-names.ts @@ -7,5 +7,6 @@ export const metricResolverEmitter = { getAllJenkinsServers: `${server}.getAllServers.emitted`, getJenkinsServerWithSecret: `${server}.getWithSecretServer.emitted`, disconnectJenkinsServer: `${server}.disconnectServer.emitted`, - generateNewSecretForServer: `${server}.generateNewSecret.emitted` + generateNewSecretForServer: `${server}.generateNewSecret.emitted`, + redirectFromGetStartedPage: `${server}.getStartedRedirect.emitted` }; diff --git a/app/src/index.ts b/app/src/index.ts index 762fb65d..110a2530 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -1,19 +1,10 @@ import resolver from './resolvers'; -import { runGetStartedPage } from './storage/run-as-get-started'; +import { redirectFromGetStarted } from './utils/redirect-from-get-started'; import handleJenkinsRequest from './webtrigger/handle-jenkins-request'; import { handleResetJenkinsRequest } from './webtrigger/handle-reset-jenkins-request'; -// import { WebtriggerRequest } from './webtrigger/types'; - -// const runGetStartedPage = ( -// request: WebtriggerRequest -// ) => { -// const { siteUrl, environmentId } = request.context; -// const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; -// return { siteUrl, appId, environmentId }; -// }; // webtriggers export { handleJenkinsRequest, handleResetJenkinsRequest }; // resolvers -export { resolver, runGetStartedPage }; +export { resolver, redirectFromGetStarted }; diff --git a/app/src/resolvers.ts b/app/src/resolvers.ts index 326281c1..f1e3052c 100644 --- a/app/src/resolvers.ts +++ b/app/src/resolvers.ts @@ -12,7 +12,7 @@ import { deleteDeployments } from './jira-client/delete-deployments'; import { adminPermissionCheck } from './check-permissions'; import { metricResolverEmitter } from './common/metric-names'; import { generateNewSecret } from './storage/generate-new-secret'; -import { RunAsGetStarted, runGetStartedPage } from './storage/run-as-get-started'; +import { RedirectFromGetStarted, redirectFromGetStarted } from './utils/redirect-from-get-started'; const resolver = new Resolver(); @@ -74,9 +74,10 @@ resolver.define('fetchCloudId', async (req): Promise => { return req.context.cloudId; }); -resolver.define('runGetStartedPage', async (req): Promise => { +resolver.define('runGetStartedPage', async (req): Promise => { await adminPermissionCheck(req); - return runGetStartedPage(req); + internalMetrics.counter(metricResolverEmitter.generateNewSecretForServer).incr(); + return redirectFromGetStarted(req); }); export default resolver.getDefinitions(); diff --git a/app/src/storage/run-as-get-started.ts b/app/src/storage/run-as-get-started.ts deleted file mode 100644 index 41054087..00000000 --- a/app/src/storage/run-as-get-started.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Logger } from '../config/logger'; - -export type RunAsGetStarted = { - siteUrl: string, - appId: string, - environmentId: string -}; - -const runGetStartedPage = (request: any): RunAsGetStarted => { - const logger = Logger.getInstance('runGetStartedPage'); - const { siteUrl, environmentId } = request.context; - const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; - logger.info('returning values for runGetStartedPage... testing deployment change'); - return { siteUrl, appId, environmentId }; -}; - -export { runGetStartedPage }; diff --git a/app/src/utils/redirect-from-get-started.ts b/app/src/utils/redirect-from-get-started.ts new file mode 100644 index 00000000..76aaea9f --- /dev/null +++ b/app/src/utils/redirect-from-get-started.ts @@ -0,0 +1,13 @@ +export type RedirectFromGetStarted = { + siteUrl: string, + appId: string, + environmentId: string +}; + +const redirectFromGetStarted = (request: any): RedirectFromGetStarted => { + const { siteUrl, environmentId } = request.context; + const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; + return { siteUrl, appId, environmentId }; +}; + +export { redirectFromGetStarted }; From f7daa3d366c182bbf627e9cb5cbcf1ffb6448c23 Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 11:34:59 +1100 Subject: [PATCH 5/8] clean up --- app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts | 2 +- app/src/resolvers.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts index 6a137855..0bf3f451 100644 --- a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts +++ b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts @@ -7,7 +7,7 @@ interface Context { } const redirectFromGetStarted = async () => { - const context: Context = await invoke('runGetStartedPage'); + const context: Context = await invoke('redirectFromGetStarted'); const { siteUrl, appId, environmentId } = context; router.navigate(`${siteUrl}/jira/settings/apps/${appId}/${environmentId}/`); }; diff --git a/app/src/resolvers.ts b/app/src/resolvers.ts index f1e3052c..041d064c 100644 --- a/app/src/resolvers.ts +++ b/app/src/resolvers.ts @@ -74,7 +74,7 @@ resolver.define('fetchCloudId', async (req): Promise => { return req.context.cloudId; }); -resolver.define('runGetStartedPage', async (req): Promise => { +resolver.define('redirectFromGetStarted', async (req): Promise => { await adminPermissionCheck(req); internalMetrics.counter(metricResolverEmitter.generateNewSecretForServer).incr(); return redirectFromGetStarted(req); From 0055ac4a9b069a712c962ac57697a870754d16fd Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 12:11:11 +1100 Subject: [PATCH 6/8] add tests --- .../src/__mocks__/@forge/bridge/index.ts | 3 +++ .../src/api/redirectFromGetStarted.test.ts | 24 +++++++++++++++++++ .../utils/redirect-from-get-started.test.ts | 22 +++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts create mode 100644 app/src/utils/redirect-from-get-started.test.ts diff --git a/app/jenkins-for-jira-ui/src/__mocks__/@forge/bridge/index.ts b/app/jenkins-for-jira-ui/src/__mocks__/@forge/bridge/index.ts index bc66c214..f153f337 100644 --- a/app/jenkins-for-jira-ui/src/__mocks__/@forge/bridge/index.ts +++ b/app/jenkins-for-jira-ui/src/__mocks__/@forge/bridge/index.ts @@ -1 +1,4 @@ export const invoke = jest.fn(); +export const router = { + navigate: jest.fn() +}; diff --git a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts new file mode 100644 index 00000000..d732bb5a --- /dev/null +++ b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts @@ -0,0 +1,24 @@ +import { invoke, router } from '@forge/bridge'; +import { redirectFromGetStarted } from './redirectFromGetStarted'; + +describe('redirectFromGetStarted', () => { + it('should call invoke and router.navigate with the correct parameters', async () => { + const contextData = { + siteUrl: 'https://testjirasite.com', + appId: '1234-567-890', + environmentId: '93-2348248121-3428-345734593' + }; + + (invoke as jest.Mock).mockResolvedValue(contextData); + await redirectFromGetStarted(); + expect(invoke).toHaveBeenCalledWith('redirectFromGetStarted'); + expect(router.navigate).toHaveBeenCalledWith( + `${contextData.siteUrl}/jira/settings/apps/${contextData.appId}/${contextData.environmentId}/` + ); + }); + + it('should handle errors gracefully', async () => { + (invoke as jest.Mock).mockRejectedValue(new Error('Test error')); + await expect(redirectFromGetStarted()).rejects.toThrow('Test error'); + }); +}); diff --git a/app/src/utils/redirect-from-get-started.test.ts b/app/src/utils/redirect-from-get-started.test.ts new file mode 100644 index 00000000..4b4c800a --- /dev/null +++ b/app/src/utils/redirect-from-get-started.test.ts @@ -0,0 +1,22 @@ +import { redirectFromGetStarted, RedirectFromGetStarted } from './redirect-from-get-started'; + +describe('redirectFromGetStarted', () => { + it('should return the expected RedirectFromGetStarted object', () => { + const mockRequest = { + context: { + siteUrl: 'https://testjira.com', + appId: 'df76f661-4cbe-4768-a119-13992dc4ce2d', + environmentId: '1831-1281423-12389342983', + }, + }; + + const result: RedirectFromGetStarted = redirectFromGetStarted(mockRequest); + const expected: RedirectFromGetStarted = { + siteUrl: mockRequest.context.siteUrl, + appId: mockRequest.context.appId, + environmentId: mockRequest.context.environmentId, + }; + + expect(result).toEqual(expected); + }); +}); From fcda7f027d7277f4bbb408589087bfece0bf150b Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 13:57:47 +1100 Subject: [PATCH 7/8] improve redirect --- .../src/api/redirectFromGetStarted.test.ts | 22 +++++- .../src/api/redirectFromGetStarted.ts | 17 ++++- .../JenkinsServerList/JenkinsServerList.tsx | 70 ++++++++++++------- .../utils/redirect-from-get-started.test.ts | 14 +++- app/src/utils/redirect-from-get-started.ts | 12 +++- 5 files changed, 98 insertions(+), 37 deletions(-) diff --git a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts index d732bb5a..a6c06297 100644 --- a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts +++ b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts @@ -2,11 +2,12 @@ import { invoke, router } from '@forge/bridge'; import { redirectFromGetStarted } from './redirectFromGetStarted'; describe('redirectFromGetStarted', () => { - it('should call invoke and router.navigate with the correct parameters', async () => { + it('should call invoke and router.navigate with the correct parameters from get started page', async () => { const contextData = { siteUrl: 'https://testjirasite.com', appId: '1234-567-890', - environmentId: '93-2348248121-3428-345734593' + environmentId: '93-2348248121-3428-345734593', + moduleKey: 'get-started-page' }; (invoke as jest.Mock).mockResolvedValue(contextData); @@ -17,6 +18,23 @@ describe('redirectFromGetStarted', () => { ); }); + it('should call invoke but should not call router.navigate with the correct parameters from admin page', + async () => { + const contextData = { + siteUrl: 'https://testjirasite.com', + appId: '1234-567-890', + environmentId: '93-2348248121-3428-345734593', + moduleKey: 'not-get-started-page' + }; + + (invoke as jest.Mock).mockResolvedValue(contextData); + await redirectFromGetStarted(); + expect(invoke).toHaveBeenCalledWith('redirectFromGetStarted'); + expect(router.navigate).not.toHaveBeenCalledWith( + `${contextData.siteUrl}/jira/settings/apps/${contextData.appId}/${contextData.environmentId}/` + ); + }); + it('should handle errors gracefully', async () => { (invoke as jest.Mock).mockRejectedValue(new Error('Test error')); await expect(redirectFromGetStarted()).rejects.toThrow('Test error'); diff --git a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts index 0bf3f451..7992369a 100644 --- a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts +++ b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.ts @@ -4,12 +4,23 @@ interface Context { siteUrl: string; appId: string; environmentId: string; + moduleKey: string; } -const redirectFromGetStarted = async () => { +const redirectFromGetStarted = async (): Promise => { const context: Context = await invoke('redirectFromGetStarted'); - const { siteUrl, appId, environmentId } = context; - router.navigate(`${siteUrl}/jira/settings/apps/${appId}/${environmentId}/`); + const { + siteUrl, + appId, + environmentId, + moduleKey + } = context; + + if (moduleKey === 'get-started-page') { + router.navigate(`${siteUrl}/jira/settings/apps/${appId}/${environmentId}/`); + } + + return moduleKey; }; export { diff --git a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx index e577e5e3..61bf54f1 100644 --- a/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx +++ b/app/jenkins-for-jira-ui/src/components/JenkinsServerList/JenkinsServerList.tsx @@ -1,6 +1,7 @@ -import { useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { useHistory } from 'react-router'; import { ButtonGroup } from '@atlaskit/button'; +import Spinner from '@atlaskit/spinner'; import Button from '@atlaskit/button/standard-button'; import PageHeader from '@atlaskit/page-header'; import { EmptyState } from '../EmptyState/EmptyState'; @@ -22,19 +23,21 @@ const JenkinsServerList = (): JSX.Element => { const history = useHistory(); const analyticsClient = new AnalyticsClient(); const [jenkinsServers, setJenkinsServers] = useState(); + const [moduleKey, setModuleKey] = useState(); const fetchAllJenkinsServers = async () => { const servers = await getAllJenkinsServers() || []; setJenkinsServers(servers); }; - const redirectToAdminPage = async () => { - await redirectFromGetStarted(); - }; + const redirectToAdminPage = useCallback(async () => { + const currentModuleKey = await redirectFromGetStarted(); + setModuleKey(currentModuleKey); + }, []); useEffect(() => { fetchAllJenkinsServers(); redirectToAdminPage(); - }, []); + }, [redirectToAdminPage]); if (!jenkinsServers) { return ; @@ -62,29 +65,44 @@ const JenkinsServerList = (): JSX.Element => { ); - return jenkinsServers?.length ? ( - <> -
- Jenkins configuration -
+ let contentToRender; - - After you connect your Jenkins server to Jira and send a deployment - event from your CI/CD tool, you will be able to view development - information within your linked Jira issue and view deployment pipelines - over a timeline with insights. - + if (jenkinsServers?.length && moduleKey === 'jenkins-for-jira-ui-admin-page') { + contentToRender = ( + <> +
+ Jenkins configuration +
+ + After you connect your Jenkins server to Jira and send a deployment + event from your CI/CD tool, you will be able to view development + information within your linked Jira issue and view deployment pipelines + over a timeline with insights. + + + + ); + } else if (moduleKey === 'get-started-page') { + contentToRender = ( + <> +
+ Jenkins configuration +
+ + + ); + } else { + contentToRender = ( + <> +
+ Jenkins configuration +
+ + + ); + } - - - ) : ( - <> -
- Jenkins configuration -
- - - ); + return contentToRender; }; export { diff --git a/app/src/utils/redirect-from-get-started.test.ts b/app/src/utils/redirect-from-get-started.test.ts index 4b4c800a..8bd0dca0 100644 --- a/app/src/utils/redirect-from-get-started.test.ts +++ b/app/src/utils/redirect-from-get-started.test.ts @@ -7,14 +7,22 @@ describe('redirectFromGetStarted', () => { siteUrl: 'https://testjira.com', appId: 'df76f661-4cbe-4768-a119-13992dc4ce2d', environmentId: '1831-1281423-12389342983', + moduleKey: 'some-page' }, }; const result: RedirectFromGetStarted = redirectFromGetStarted(mockRequest); + const { + siteUrl, + appId, + environmentId, + moduleKey + } = mockRequest.context; const expected: RedirectFromGetStarted = { - siteUrl: mockRequest.context.siteUrl, - appId: mockRequest.context.appId, - environmentId: mockRequest.context.environmentId, + siteUrl, + appId, + environmentId, + moduleKey }; expect(result).toEqual(expected); diff --git a/app/src/utils/redirect-from-get-started.ts b/app/src/utils/redirect-from-get-started.ts index 76aaea9f..e316701a 100644 --- a/app/src/utils/redirect-from-get-started.ts +++ b/app/src/utils/redirect-from-get-started.ts @@ -1,13 +1,19 @@ export type RedirectFromGetStarted = { siteUrl: string, appId: string, - environmentId: string + environmentId: string, + moduleKey: string }; const redirectFromGetStarted = (request: any): RedirectFromGetStarted => { - const { siteUrl, environmentId } = request.context; + const { siteUrl, environmentId, moduleKey } = request.context; const appId = 'df76f661-4cbe-4768-a119-13992dc4ce2d'; - return { siteUrl, appId, environmentId }; + return { + siteUrl, + appId, + environmentId, + moduleKey + }; }; export { redirectFromGetStarted }; From db0cef186f290f9e02b6448ddde9de62643f561a Mon Sep 17 00:00:00 2001 From: Rachelle Rathbone Date: Mon, 6 Nov 2023 13:58:19 +1100 Subject: [PATCH 8/8] improve redirect --- .../src/api/redirectFromGetStarted.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts index a6c06297..6f55cd3c 100644 --- a/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts +++ b/app/jenkins-for-jira-ui/src/api/redirectFromGetStarted.test.ts @@ -1,6 +1,10 @@ import { invoke, router } from '@forge/bridge'; import { redirectFromGetStarted } from './redirectFromGetStarted'; +beforeEach(() => { + jest.clearAllMocks(); +}); + describe('redirectFromGetStarted', () => { it('should call invoke and router.navigate with the correct parameters from get started page', async () => { const contextData = {