diff options
Diffstat (limited to 'spec/frontend/environments/graphql')
-rw-r--r-- | spec/frontend/environments/graphql/mock_data.js | 530 | ||||
-rw-r--r-- | spec/frontend/environments/graphql/resolvers_spec.js | 91 |
2 files changed, 621 insertions, 0 deletions
diff --git a/spec/frontend/environments/graphql/mock_data.js b/spec/frontend/environments/graphql/mock_data.js new file mode 100644 index 00000000000..e56b6448b7d --- /dev/null +++ b/spec/frontend/environments/graphql/mock_data.js @@ -0,0 +1,530 @@ +export const environmentsApp = { + environments: [ + { + name: 'review', + size: 2, + latest: { + id: 42, + global_id: 'gid://gitlab/Environment/42', + name: 'review/goodbye', + state: 'available', + external_url: 'https://example.org', + environment_type: 'review', + name_without_type: 'goodbye', + last_deployment: null, + has_stop_action: false, + rollout_status: null, + environment_path: '/h5bp/html5-boilerplate/-/environments/42', + stop_path: '/h5bp/html5-boilerplate/-/environments/42/stop', + cancel_auto_stop_path: '/h5bp/html5-boilerplate/-/environments/42/cancel_auto_stop', + delete_path: '/api/v4/projects/8/environments/42', + folder_path: '/h5bp/html5-boilerplate/-/environments/folders/review', + created_at: '2021-10-04T19:27:20.639Z', + updated_at: '2021-10-04T19:27:20.639Z', + can_stop: true, + logs_path: '/h5bp/html5-boilerplate/-/logs?environment_name=review%2Fgoodbye', + logs_api_path: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=review%2Fgoodbye', + enable_advanced_logs_querying: false, + can_delete: false, + has_opened_alert: false, + }, + }, + { + name: 'production', + size: 1, + latest: { + id: 8, + global_id: 'gid://gitlab/Environment/8', + name: 'production', + state: 'available', + external_url: 'https://example.org', + environment_type: null, + name_without_type: 'production', + last_deployment: { + id: 80, + iid: 24, + sha: '4ca0310329e8f251b892d7be205eec8b7dd220e5', + ref: { + name: 'root-master-patch-18104', + ref_path: '/h5bp/html5-boilerplate/-/tree/root-master-patch-18104', + }, + status: 'success', + created_at: '2021-10-08T19:53:54.543Z', + deployed_at: '2021-10-08T20:02:36.763Z', + tag: false, + 'last?': true, + user: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + web_url: 'http://gdk.test:3000/root', + show_status: false, + path: '/root', + }, + deployable: { + id: 911, + name: 'deploy-job', + started: '2021-10-08T19:54:00.658Z', + complete: true, + archived: false, + build_path: '/h5bp/html5-boilerplate/-/jobs/911', + retry_path: '/h5bp/html5-boilerplate/-/jobs/911/retry', + play_path: '/h5bp/html5-boilerplate/-/jobs/911/play', + playable: true, + scheduled: false, + created_at: '2021-10-08T19:53:54.482Z', + updated_at: '2021-10-08T20:02:36.730Z', + status: { + icon: 'status_success', + text: 'passed', + label: 'manual play action', + group: 'success', + tooltip: 'passed', + has_details: true, + details_path: '/h5bp/html5-boilerplate/-/jobs/911', + illustration: { + image: + '/assets/illustrations/manual_action-c55aee2c5f9ebe9f72751480af8bb307be1a6f35552f344cc6d1bf979d3422f6.svg', + size: 'svg-394', + title: 'This job requires a manual action', + content: + 'This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.', + }, + favicon: + '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png', + action: { + icon: 'play', + title: 'Play', + path: '/h5bp/html5-boilerplate/-/jobs/911/play', + method: 'post', + button_title: 'Trigger this manual action', + }, + }, + }, + commit: { + id: '4ca0310329e8f251b892d7be205eec8b7dd220e5', + short_id: '4ca03103', + created_at: '2021-10-08T19:27:01.000+00:00', + parent_ids: ['b385360b15bd61391a0efbd101788d4a80387270'], + title: 'Update .gitlab-ci.yml', + message: 'Update .gitlab-ci.yml', + author_name: 'Administrator', + author_email: 'admin@example.com', + authored_date: '2021-10-08T19:27:01.000+00:00', + committer_name: 'Administrator', + committer_email: 'admin@example.com', + committed_date: '2021-10-08T19:27:01.000+00:00', + trailers: {}, + web_url: + 'http://gdk.test:3000/h5bp/html5-boilerplate/-/commit/4ca0310329e8f251b892d7be205eec8b7dd220e5', + author: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + web_url: 'http://gdk.test:3000/root', + show_status: false, + path: '/root', + }, + author_gravatar_url: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + commit_url: + 'http://gdk.test:3000/h5bp/html5-boilerplate/-/commit/4ca0310329e8f251b892d7be205eec8b7dd220e5', + commit_path: + '/h5bp/html5-boilerplate/-/commit/4ca0310329e8f251b892d7be205eec8b7dd220e5', + }, + manual_actions: [], + scheduled_actions: [], + playable_build: { + retry_path: '/h5bp/html5-boilerplate/-/jobs/911/retry', + play_path: '/h5bp/html5-boilerplate/-/jobs/911/play', + }, + cluster: null, + }, + has_stop_action: false, + rollout_status: null, + environment_path: '/h5bp/html5-boilerplate/-/environments/8', + stop_path: '/h5bp/html5-boilerplate/-/environments/8/stop', + cancel_auto_stop_path: '/h5bp/html5-boilerplate/-/environments/8/cancel_auto_stop', + delete_path: '/api/v4/projects/8/environments/8', + folder_path: '/h5bp/html5-boilerplate/-/environments/folders/production', + created_at: '2021-06-17T15:09:38.599Z', + updated_at: '2021-10-08T19:50:44.445Z', + can_stop: true, + logs_path: '/h5bp/html5-boilerplate/-/logs?environment_name=production', + logs_api_path: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=production', + enable_advanced_logs_querying: false, + can_delete: false, + has_opened_alert: false, + }, + }, + { + name: 'staging', + size: 1, + latest: { + id: 7, + global_id: 'gid://gitlab/Environment/7', + name: 'staging', + state: 'available', + external_url: null, + environment_type: null, + name_without_type: 'staging', + last_deployment: null, + has_stop_action: false, + rollout_status: null, + environment_path: '/h5bp/html5-boilerplate/-/environments/7', + stop_path: '/h5bp/html5-boilerplate/-/environments/7/stop', + cancel_auto_stop_path: '/h5bp/html5-boilerplate/-/environments/7/cancel_auto_stop', + delete_path: '/api/v4/projects/8/environments/7', + folder_path: '/h5bp/html5-boilerplate/-/environments/folders/staging', + created_at: '2021-06-17T15:09:38.570Z', + updated_at: '2021-06-17T15:09:38.570Z', + can_stop: true, + logs_path: '/h5bp/html5-boilerplate/-/logs?environment_name=staging', + logs_api_path: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=staging', + enable_advanced_logs_querying: false, + can_delete: false, + has_opened_alert: false, + }, + }, + ], + review_app: { + can_setup_review_app: true, + all_clusters_empty: true, + review_snippet: + '{"deploy_review"=>{"stage"=>"deploy", "script"=>["echo \\"Deploy a review app\\""], "environment"=>{"name"=>"review/$CI_COMMIT_REF_NAME", "url"=>"https://$CI_ENVIRONMENT_SLUG.example.com"}, "only"=>["branches"]}}', + }, + available_count: 4, + stopped_count: 0, +}; + +export const resolvedEnvironmentsApp = { + availableCount: 4, + environments: [ + { + name: 'review', + size: 2, + latest: { + id: 42, + globalId: 'gid://gitlab/Environment/42', + name: 'review/goodbye', + state: 'available', + externalUrl: 'https://example.org', + environmentType: 'review', + nameWithoutType: 'goodbye', + lastDeployment: null, + hasStopAction: false, + rolloutStatus: null, + environmentPath: '/h5bp/html5-boilerplate/-/environments/42', + stopPath: '/h5bp/html5-boilerplate/-/environments/42/stop', + cancelAutoStopPath: '/h5bp/html5-boilerplate/-/environments/42/cancel_auto_stop', + deletePath: '/api/v4/projects/8/environments/42', + folderPath: '/h5bp/html5-boilerplate/-/environments/folders/review', + createdAt: '2021-10-04T19:27:20.639Z', + updatedAt: '2021-10-04T19:27:20.639Z', + canStop: true, + logsPath: '/h5bp/html5-boilerplate/-/logs?environment_name=review%2Fgoodbye', + logsApiPath: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=review%2Fgoodbye', + enableAdvancedLogsQuerying: false, + canDelete: false, + hasOpenedAlert: false, + }, + __typename: 'NestedLocalEnvironment', + }, + { + name: 'production', + size: 1, + latest: { + id: 8, + globalId: 'gid://gitlab/Environment/8', + name: 'production', + state: 'available', + externalUrl: 'https://example.org', + environmentType: null, + nameWithoutType: 'production', + lastDeployment: { + id: 80, + iid: 24, + sha: '4ca0310329e8f251b892d7be205eec8b7dd220e5', + ref: { + name: 'root-master-patch-18104', + refPath: '/h5bp/html5-boilerplate/-/tree/root-master-patch-18104', + }, + status: 'success', + createdAt: '2021-10-08T19:53:54.543Z', + deployedAt: '2021-10-08T20:02:36.763Z', + tag: false, + 'last?': true, + user: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatarUrl: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + webUrl: 'http://gdk.test:3000/root', + showStatus: false, + path: '/root', + }, + deployable: { + id: 911, + name: 'deploy-job', + started: '2021-10-08T19:54:00.658Z', + complete: true, + archived: false, + buildPath: '/h5bp/html5-boilerplate/-/jobs/911', + retryPath: '/h5bp/html5-boilerplate/-/jobs/911/retry', + playPath: '/h5bp/html5-boilerplate/-/jobs/911/play', + playable: true, + scheduled: false, + createdAt: '2021-10-08T19:53:54.482Z', + updatedAt: '2021-10-08T20:02:36.730Z', + status: { + icon: 'status_success', + text: 'passed', + label: 'manual play action', + group: 'success', + tooltip: 'passed', + hasDetails: true, + detailsPath: '/h5bp/html5-boilerplate/-/jobs/911', + illustration: { + image: + '/assets/illustrations/manual_action-c55aee2c5f9ebe9f72751480af8bb307be1a6f35552f344cc6d1bf979d3422f6.svg', + size: 'svg-394', + title: 'This job requires a manual action', + content: + 'This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.', + }, + favicon: + '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png', + action: { + icon: 'play', + title: 'Play', + path: '/h5bp/html5-boilerplate/-/jobs/911/play', + method: 'post', + buttonTitle: 'Trigger this manual action', + }, + }, + }, + commit: { + id: '4ca0310329e8f251b892d7be205eec8b7dd220e5', + shortId: '4ca03103', + createdAt: '2021-10-08T19:27:01.000+00:00', + parentIds: ['b385360b15bd61391a0efbd101788d4a80387270'], + title: 'Update .gitlab-ci.yml', + message: 'Update .gitlab-ci.yml', + authorName: 'Administrator', + authorEmail: 'admin@example.com', + authoredDate: '2021-10-08T19:27:01.000+00:00', + committerName: 'Administrator', + committerEmail: 'admin@example.com', + committedDate: '2021-10-08T19:27:01.000+00:00', + trailers: {}, + webUrl: + 'http://gdk.test:3000/h5bp/html5-boilerplate/-/commit/4ca0310329e8f251b892d7be205eec8b7dd220e5', + author: { + id: 1, + name: 'Administrator', + username: 'root', + state: 'active', + avatarUrl: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + webUrl: 'http://gdk.test:3000/root', + showStatus: false, + path: '/root', + }, + authorGravatarUrl: + 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', + commitUrl: + 'http://gdk.test:3000/h5bp/html5-boilerplate/-/commit/4ca0310329e8f251b892d7be205eec8b7dd220e5', + commitPath: '/h5bp/html5-boilerplate/-/commit/4ca0310329e8f251b892d7be205eec8b7dd220e5', + }, + manualActions: [], + scheduledActions: [], + playableBuild: { + retryPath: '/h5bp/html5-boilerplate/-/jobs/911/retry', + playPath: '/h5bp/html5-boilerplate/-/jobs/911/play', + }, + cluster: null, + }, + hasStopAction: false, + rolloutStatus: null, + environmentPath: '/h5bp/html5-boilerplate/-/environments/8', + stopPath: '/h5bp/html5-boilerplate/-/environments/8/stop', + cancelAutoStopPath: '/h5bp/html5-boilerplate/-/environments/8/cancel_auto_stop', + deletePath: '/api/v4/projects/8/environments/8', + folderPath: '/h5bp/html5-boilerplate/-/environments/folders/production', + createdAt: '2021-06-17T15:09:38.599Z', + updatedAt: '2021-10-08T19:50:44.445Z', + canStop: true, + logsPath: '/h5bp/html5-boilerplate/-/logs?environment_name=production', + logsApiPath: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=production', + enableAdvancedLogsQuerying: false, + canDelete: false, + hasOpenedAlert: false, + }, + __typename: 'NestedLocalEnvironment', + }, + { + name: 'staging', + size: 1, + latest: { + id: 7, + globalId: 'gid://gitlab/Environment/7', + name: 'staging', + state: 'available', + externalUrl: null, + environmentType: null, + nameWithoutType: 'staging', + lastDeployment: null, + hasStopAction: false, + rolloutStatus: null, + environmentPath: '/h5bp/html5-boilerplate/-/environments/7', + stopPath: '/h5bp/html5-boilerplate/-/environments/7/stop', + cancelAutoStopPath: '/h5bp/html5-boilerplate/-/environments/7/cancel_auto_stop', + deletePath: '/api/v4/projects/8/environments/7', + folderPath: '/h5bp/html5-boilerplate/-/environments/folders/staging', + createdAt: '2021-06-17T15:09:38.570Z', + updatedAt: '2021-06-17T15:09:38.570Z', + canStop: true, + logsPath: '/h5bp/html5-boilerplate/-/logs?environment_name=staging', + logsApiPath: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=staging', + enableAdvancedLogsQuerying: false, + canDelete: false, + hasOpenedAlert: false, + }, + __typename: 'NestedLocalEnvironment', + }, + ], + reviewApp: { + canSetupReviewApp: true, + allClustersEmpty: true, + reviewSnippet: + '{"deploy_review"=>{"stage"=>"deploy", "script"=>["echo \\"Deploy a review app\\""], "environment"=>{"name"=>"review/$CI_COMMIT_REF_NAME", "url"=>"https://$CI_ENVIRONMENT_SLUG.example.com"}, "only"=>["branches"]}}', + __typename: 'ReviewApp', + }, + stoppedCount: 0, + __typename: 'LocalEnvironmentApp', +}; + +export const folder = { + environments: [ + { + id: 42, + global_id: 'gid://gitlab/Environment/42', + name: 'review/goodbye', + state: 'available', + external_url: 'https://example.org', + environment_type: 'review', + name_without_type: 'goodbye', + last_deployment: null, + has_stop_action: false, + rollout_status: null, + environment_path: '/h5bp/html5-boilerplate/-/environments/42', + stop_path: '/h5bp/html5-boilerplate/-/environments/42/stop', + cancel_auto_stop_path: '/h5bp/html5-boilerplate/-/environments/42/cancel_auto_stop', + delete_path: '/api/v4/projects/8/environments/42', + folder_path: '/h5bp/html5-boilerplate/-/environments/folders/review', + created_at: '2021-10-04T19:27:20.639Z', + updated_at: '2021-10-04T19:27:20.639Z', + can_stop: true, + logs_path: '/h5bp/html5-boilerplate/-/logs?environment_name=review%2Fgoodbye', + logs_api_path: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=review%2Fgoodbye', + enable_advanced_logs_querying: false, + can_delete: false, + has_opened_alert: false, + }, + { + id: 41, + global_id: 'gid://gitlab/Environment/41', + name: 'review/hello', + state: 'available', + external_url: 'https://example.org', + environment_type: 'review', + name_without_type: 'hello', + last_deployment: null, + has_stop_action: false, + rollout_status: null, + environment_path: '/h5bp/html5-boilerplate/-/environments/41', + stop_path: '/h5bp/html5-boilerplate/-/environments/41/stop', + cancel_auto_stop_path: '/h5bp/html5-boilerplate/-/environments/41/cancel_auto_stop', + delete_path: '/api/v4/projects/8/environments/41', + folder_path: '/h5bp/html5-boilerplate/-/environments/folders/review', + created_at: '2021-10-04T19:27:00.527Z', + updated_at: '2021-10-04T19:27:00.527Z', + can_stop: true, + logs_path: '/h5bp/html5-boilerplate/-/logs?environment_name=review%2Fhello', + logs_api_path: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=review%2Fhello', + enable_advanced_logs_querying: false, + can_delete: false, + has_opened_alert: false, + }, + ], + available_count: 2, + stopped_count: 0, +}; + +export const resolvedFolder = { + availableCount: 2, + environments: [ + { + id: 42, + globalId: 'gid://gitlab/Environment/42', + name: 'review/goodbye', + state: 'available', + externalUrl: 'https://example.org', + environmentType: 'review', + nameWithoutType: 'goodbye', + lastDeployment: null, + hasStopAction: false, + rolloutStatus: null, + environmentPath: '/h5bp/html5-boilerplate/-/environments/42', + stopPath: '/h5bp/html5-boilerplate/-/environments/42/stop', + cancelAutoStopPath: '/h5bp/html5-boilerplate/-/environments/42/cancel_auto_stop', + deletePath: '/api/v4/projects/8/environments/42', + folderPath: '/h5bp/html5-boilerplate/-/environments/folders/review', + createdAt: '2021-10-04T19:27:20.639Z', + updatedAt: '2021-10-04T19:27:20.639Z', + canStop: true, + logsPath: '/h5bp/html5-boilerplate/-/logs?environment_name=review%2Fgoodbye', + logsApiPath: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=review%2Fgoodbye', + enableAdvancedLogsQuerying: false, + canDelete: false, + hasOpenedAlert: false, + __typename: 'LocalEnvironment', + }, + { + id: 41, + globalId: 'gid://gitlab/Environment/41', + name: 'review/hello', + state: 'available', + externalUrl: 'https://example.org', + environmentType: 'review', + nameWithoutType: 'hello', + lastDeployment: null, + hasStopAction: false, + rolloutStatus: null, + environmentPath: '/h5bp/html5-boilerplate/-/environments/41', + stopPath: '/h5bp/html5-boilerplate/-/environments/41/stop', + cancelAutoStopPath: '/h5bp/html5-boilerplate/-/environments/41/cancel_auto_stop', + deletePath: '/api/v4/projects/8/environments/41', + folderPath: '/h5bp/html5-boilerplate/-/environments/folders/review', + createdAt: '2021-10-04T19:27:00.527Z', + updatedAt: '2021-10-04T19:27:00.527Z', + canStop: true, + logsPath: '/h5bp/html5-boilerplate/-/logs?environment_name=review%2Fhello', + logsApiPath: '/h5bp/html5-boilerplate/-/logs/k8s.json?environment_name=review%2Fhello', + enableAdvancedLogsQuerying: false, + canDelete: false, + hasOpenedAlert: false, + __typename: 'LocalEnvironment', + }, + ], + stoppedCount: 0, + __typename: 'LocalEnvironmentFolder', +}; diff --git a/spec/frontend/environments/graphql/resolvers_spec.js b/spec/frontend/environments/graphql/resolvers_spec.js new file mode 100644 index 00000000000..4d2a0818996 --- /dev/null +++ b/spec/frontend/environments/graphql/resolvers_spec.js @@ -0,0 +1,91 @@ +import MockAdapter from 'axios-mock-adapter'; +import axios from '~/lib/utils/axios_utils'; +import { resolvers } from '~/environments/graphql/resolvers'; +import { TEST_HOST } from 'helpers/test_constants'; +import { environmentsApp, resolvedEnvironmentsApp, folder, resolvedFolder } from './mock_data'; + +const ENDPOINT = `${TEST_HOST}/environments`; + +describe('~/frontend/environments/graphql/resolvers', () => { + let mockResolvers; + let mock; + + beforeEach(() => { + mockResolvers = resolvers(ENDPOINT); + mock = new MockAdapter(axios); + }); + + afterEach(() => { + mock.reset(); + }); + + describe('environmentApp', () => { + it('should fetch environments and map them to frontend data', async () => { + mock.onGet(ENDPOINT, { params: { nested: true } }).reply(200, environmentsApp); + + const app = await mockResolvers.Query.environmentApp(); + expect(app).toEqual(resolvedEnvironmentsApp); + }); + }); + describe('folder', () => { + it('should fetch the folder url passed to it', async () => { + mock.onGet(ENDPOINT, { params: { per_page: 3 } }).reply(200, folder); + + const environmentFolder = await mockResolvers.Query.folder(null, { + environment: { folderPath: ENDPOINT }, + }); + + expect(environmentFolder).toEqual(resolvedFolder); + }); + }); + describe('stopEnvironment', () => { + it('should post to the stop environment path', async () => { + mock.onPost(ENDPOINT).reply(200); + + await mockResolvers.Mutations.stopEnvironment(null, { environment: { stopPath: ENDPOINT } }); + + expect(mock.history.post).toContainEqual( + expect.objectContaining({ url: ENDPOINT, method: 'post' }), + ); + }); + }); + describe('rollbackEnvironment', () => { + it('should post to the retry environment path', async () => { + mock.onPost(ENDPOINT).reply(200); + + await mockResolvers.Mutations.rollbackEnvironment(null, { + environment: { retryUrl: ENDPOINT }, + }); + + expect(mock.history.post).toContainEqual( + expect.objectContaining({ url: ENDPOINT, method: 'post' }), + ); + }); + }); + describe('deleteEnvironment', () => { + it('should DELETE to the delete environment path', async () => { + mock.onDelete(ENDPOINT).reply(200); + + await mockResolvers.Mutations.deleteEnvironment(null, { + environment: { deletePath: ENDPOINT }, + }); + + expect(mock.history.delete).toContainEqual( + expect.objectContaining({ url: ENDPOINT, method: 'delete' }), + ); + }); + }); + describe('cancelAutoStop', () => { + it('should post to the auto stop path', async () => { + mock.onPost(ENDPOINT).reply(200); + + await mockResolvers.Mutations.cancelAutoStop(null, { + environment: { autoStopPath: ENDPOINT }, + }); + + expect(mock.history.post).toContainEqual( + expect.objectContaining({ url: ENDPOINT, method: 'post' }), + ); + }); + }); +}); |