Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
a5e3969d
Commit
a5e3969d
authored
Feb 28, 2020
by
Paul Slaughter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Migrate mr_widget_options_spec to Jest
- Also migrates mock_data
parent
be120757
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
394 additions
and
400 deletions
+394
-400
spec/frontend/vue_mr_widget/mock_data.js
spec/frontend/vue_mr_widget/mock_data.js
+318
-0
spec/frontend/vue_mr_widget/mr_widget_options_spec.js
spec/frontend/vue_mr_widget/mr_widget_options_spec.js
+74
-82
spec/javascripts/vue_mr_widget/mock_data.js
spec/javascripts/vue_mr_widget/mock_data.js
+2
-318
No files found.
spec/frontend/vue_mr_widget/mock_data.js
0 → 100644
View file @
a5e3969d
import
{
SUCCESS
}
from
'
~/vue_merge_request_widget/components/deployment/constants
'
;
export
default
{
id
:
132
,
iid
:
22
,
assignee_id
:
null
,
author_id
:
1
,
description
:
''
,
lock_version
:
null
,
milestone_id
:
null
,
position
:
0
,
state
:
'
merged
'
,
title
:
'
Update README.md
'
,
updated_by_id
:
null
,
created_at
:
'
2017-04-07T12:27:26.718Z
'
,
updated_at
:
'
2017-04-07T15:39:25.852Z
'
,
time_estimate
:
0
,
total_time_spent
:
0
,
human_access
:
'
Maintainer
'
,
human_time_estimate
:
null
,
human_total_time_spent
:
null
,
in_progress_merge_commit_sha
:
null
,
merge_commit_sha
:
'
53027d060246c8f47e4a9310fb332aa52f221775
'
,
short_merge_commit_sha
:
'
53027d06
'
,
merge_error
:
null
,
merge_params
:
{
force_remove_source_branch
:
null
,
},
merge_status
:
'
can_be_merged
'
,
merge_user_id
:
null
,
pipelines_empty_svg_path
:
'
/path/to/svg
'
,
source_branch
:
'
daaaa
'
,
source_branch_link
:
'
daaaa
'
,
source_project_id
:
19
,
source_project_full_path
:
'
/group1/project1
'
,
target_branch
:
'
master
'
,
target_project_id
:
19
,
target_project_full_path
:
'
/group2/project2
'
,
merge_request_add_ci_config_path
:
'
/group2/project2/new/pipeline
'
,
metrics
:
{
merged_by
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
merged_at
:
'
2017-04-07T15:39:25.696Z
'
,
closed_by
:
null
,
closed_at
:
null
,
},
author
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
merge_user
:
null
,
diff_head_sha
:
'
104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
diff_head_commit_short_id
:
'
104096c5
'
,
default_merge_commit_message
:
"
Merge branch 'daaaa' into 'master'
\n\n
Update README.md
\n\n
See merge request !22
"
,
pipeline
:
{
id
:
172
,
user
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
active
:
false
,
coverage
:
'
92.16
'
,
path
:
'
/root/acets-app/pipelines/172
'
,
details
:
{
status
:
{
icon
:
'
status_success
'
,
favicon
:
'
favicon_status_success
'
,
text
:
'
passed
'
,
label
:
'
passed
'
,
group
:
'
success
'
,
has_details
:
true
,
details_path
:
'
/root/acets-app/pipelines/172
'
,
},
duration
:
null
,
finished_at
:
'
2017-04-07T14:00:14.256Z
'
,
stages
:
[
{
name
:
'
build
'
,
title
:
'
build: failed
'
,
status
:
{
icon
:
'
status_failed
'
,
favicon
:
'
favicon_status_failed
'
,
text
:
'
failed
'
,
label
:
'
failed
'
,
group
:
'
failed
'
,
has_details
:
true
,
details_path
:
'
/root/acets-app/pipelines/172#build
'
,
},
path
:
'
/root/acets-app/pipelines/172#build
'
,
dropdown_path
:
'
/root/acets-app/pipelines/172/stage.json?stage=build
'
,
},
{
name
:
'
review
'
,
title
:
'
review: skipped
'
,
status
:
{
icon
:
'
status_skipped
'
,
favicon
:
'
favicon_status_skipped
'
,
text
:
'
skipped
'
,
label
:
'
skipped
'
,
group
:
'
skipped
'
,
has_details
:
true
,
details_path
:
'
/root/acets-app/pipelines/172#review
'
,
},
path
:
'
/root/acets-app/pipelines/172#review
'
,
dropdown_path
:
'
/root/acets-app/pipelines/172/stage.json?stage=review
'
,
},
],
artifacts
:
[],
manual_actions
:
[
{
name
:
'
stop_review
'
,
path
:
'
/root/acets-app/builds/1427/play
'
,
playable
:
false
,
},
],
},
flags
:
{
latest
:
false
,
triggered
:
false
,
stuck
:
false
,
yaml_errors
:
false
,
retryable
:
true
,
cancelable
:
false
,
merge_request_pipeline
:
false
,
detached_merge_request_pipeline
:
true
,
},
ref
:
{
name
:
'
daaaa
'
,
path
:
'
/root/acets-app/tree/daaaa
'
,
tag
:
false
,
branch
:
true
,
},
merge_request
:
{
iid
:
1
,
path
:
'
/root/detached-merge-request-pipelines/-/merge_requests/1
'
,
title
:
'
Update README.md
'
,
source_branch
:
'
feature-1
'
,
source_branch_path
:
'
/root/detached-merge-request-pipelines/branches/feature-1
'
,
target_branch
:
'
master
'
,
target_branch_path
:
'
/root/detached-merge-request-pipelines/branches/master
'
,
},
commit
:
{
id
:
'
104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
short_id
:
'
104096c5
'
,
title
:
'
Update README.md
'
,
created_at
:
'
2017-04-07T15:27:18.000+03:00
'
,
parent_ids
:
[
'
2396536178668d8930c29d904e53bd4d06228b32
'
],
message
:
'
Update README.md
'
,
author_name
:
'
Administrator
'
,
author_email
:
'
admin@example.com
'
,
authored_date
:
'
2017-04-07T15:27:18.000+03:00
'
,
committer_name
:
'
Administrator
'
,
committer_email
:
'
admin@example.com
'
,
committed_date
:
'
2017-04-07T15:27:18.000+03:00
'
,
author
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
author_gravatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
commit_url
:
'
http://localhost:3000/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
commit_path
:
'
/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
},
retry_path
:
'
/root/acets-app/pipelines/172/retry
'
,
created_at
:
'
2017-04-07T12:27:19.520Z
'
,
updated_at
:
'
2017-04-07T15:28:44.800Z
'
,
},
pipelineCoverageDelta
:
'
15.25
'
,
work_in_progress
:
false
,
source_branch_exists
:
false
,
mergeable_discussions_state
:
true
,
conflicts_can_be_resolved_in_ui
:
false
,
branch_missing
:
true
,
commits_count
:
1
,
has_conflicts
:
false
,
can_be_merged
:
true
,
has_ci
:
true
,
ci_status
:
'
success
'
,
pipeline_status_path
:
'
/root/acets-app/-/merge_requests/22/pipeline_status
'
,
issues_links
:
{
closing
:
''
,
mentioned_but_not_closing
:
''
,
},
current_user
:
{
can_resolve_conflicts
:
true
,
can_remove_source_branch
:
false
,
can_revert_on_current_merge_request
:
true
,
can_cherry_pick_on_current_merge_request
:
true
,
},
target_branch_path
:
'
/root/acets-app/branches/master
'
,
source_branch_path
:
'
/root/acets-app/branches/daaaa
'
,
conflict_resolution_ui_path
:
'
/root/acets-app/-/merge_requests/22/conflicts
'
,
remove_wip_path
:
'
/root/acets-app/-/merge_requests/22/remove_wip
'
,
cancel_auto_merge_path
:
'
/root/acets-app/-/merge_requests/22/cancel_auto_merge
'
,
create_issue_to_resolve_discussions_path
:
'
/root/acets-app/-/issues/new?merge_request_to_resolve_discussions_of=22
'
,
merge_path
:
'
/root/acets-app/-/merge_requests/22/merge
'
,
cherry_pick_in_fork_path
:
'
/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+revert+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1
'
,
revert_in_fork_path
:
'
/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+cherry-pick+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1
'
,
email_patches_path
:
'
/root/acets-app/-/merge_requests/22.patch
'
,
plain_diff_path
:
'
/root/acets-app/-/merge_requests/22.diff
'
,
merge_request_basic_path
:
'
/root/acets-app/-/merge_requests/22.json?serializer=basic
'
,
merge_request_widget_path
:
'
/root/acets-app/-/merge_requests/22/widget.json
'
,
merge_request_cached_widget_path
:
'
/cached.json
'
,
merge_check_path
:
'
/root/acets-app/-/merge_requests/22/merge_check
'
,
ci_environments_status_url
:
'
/root/acets-app/-/merge_requests/22/ci_environments_status
'
,
project_archived
:
false
,
default_merge_commit_message_with_description
:
"
Merge branch 'daaaa' into 'master'
\n\n
Update README.md
\n\n
See merge request !22
"
,
default_squash_commit_message
:
'
Test squash commit message
'
,
diverged_commits_count
:
0
,
only_allow_merge_if_pipeline_succeeds
:
false
,
commit_change_content_path
:
'
/root/acets-app/-/merge_requests/22/commit_change_content
'
,
merge_commit_path
:
'
http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775
'
,
troubleshooting_docs_path
:
'
help
'
,
merge_request_pipelines_docs_path
:
'
/help/ci/merge_request_pipelines/index.md
'
,
merge_train_when_pipeline_succeeds_docs_path
:
'
/help/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/#startadd-to-merge-train-when-pipeline-succeeds
'
,
squash
:
true
,
visual_review_app_available
:
true
,
merge_trains_enabled
:
true
,
merge_trains_count
:
3
,
merge_train_index
:
1
,
};
export
const
mockStore
=
{
pipeline
:
{
id
:
0
,
details
:
{
status
:
{
details_path
:
'
/root/review-app-tester/pipelines/66
'
,
favicon
:
'
/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png
'
,
group
:
'
success-with-warnings
'
,
has_details
:
true
,
icon
:
'
status_warning
'
,
illustration
:
null
,
label
:
'
passed with warnings
'
,
text
:
'
passed
'
,
tooltip
:
'
passed
'
,
},
},
flags
:
{},
ref
:
{},
},
mergePipeline
:
{
id
:
1
,
details
:
{
status
:
{
details_path
:
'
/root/review-app-tester/pipelines/66
'
,
favicon
:
'
/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png
'
,
group
:
'
success-with-warnings
'
,
has_details
:
true
,
icon
:
'
status_warning
'
,
illustration
:
null
,
label
:
'
passed with warnings
'
,
text
:
'
passed
'
,
tooltip
:
'
passed
'
,
},
},
flags
:
{},
ref
:
{},
},
targetBranch
:
'
target-branch
'
,
sourceBranch
:
'
source-branch
'
,
sourceBranchLink
:
'
source-branch-link
'
,
deployments
:
[
{
id
:
0
,
name
:
'
bogus
'
,
external_url
:
'
https://fake.com
'
,
external_url_formatted
:
'
https://fake.com
'
,
status
:
SUCCESS
,
},
{
id
:
1
,
name
:
'
bogus-docs
'
,
external_url
:
'
https://fake.com
'
,
external_url_formatted
:
'
https://fake.com
'
,
status
:
SUCCESS
,
},
],
postMergeDeployments
:
[
{
id
:
0
,
name
:
'
prod
'
,
status
:
SUCCESS
},
{
id
:
1
,
name
:
'
prod-docs
'
,
status
:
SUCCESS
},
],
troubleshootingDocsPath
:
'
troubleshooting-docs-path
'
,
ciStatus
:
'
ci-status
'
,
hasCI
:
true
,
exposedArtifactsPath
:
'
exposed_artifacts.json
'
,
};
spec/
javascripts
/vue_mr_widget/mr_widget_options_spec.js
→
spec/
frontend
/vue_mr_widget/mr_widget_options_spec.js
View file @
a5e3969d
import
Vue
from
'
vue
'
;
import
Vue
from
'
vue
'
;
import
MockAdapter
from
'
axios-mock-adapter
'
;
import
MockAdapter
from
'
axios-mock-adapter
'
;
import
mountComponent
from
'
spec/helpers/vue_mount_component_helper
'
;
import
mountComponent
from
'
helpers/vue_mount_component_helper
'
;
import
waitForPromises
from
'
spec/helpers/wait_for_promises
'
;
import
axios
from
'
~/lib/utils/axios_utils
'
;
import
axios
from
'
~/lib/utils/axios_utils
'
;
import
mrWidgetOptions
from
'
~/vue_merge_request_widget/mr_widget_options.vue
'
;
import
mrWidgetOptions
from
'
~/vue_merge_request_widget/mr_widget_options.vue
'
;
import
eventHub
from
'
~/vue_merge_request_widget/event_hub
'
;
import
eventHub
from
'
~/vue_merge_request_widget/event_hub
'
;
import
notify
from
'
~/lib/utils/notify
'
;
import
notify
from
'
~/lib/utils/notify
'
;
import
SmartInterval
from
'
~/smart_interval
'
;
import
{
stateKey
}
from
'
~/vue_merge_request_widget/stores/state_maps
'
;
import
{
stateKey
}
from
'
~/vue_merge_request_widget/stores/state_maps
'
;
import
mockData
from
'
./mock_data
'
;
import
mockData
from
'
./mock_data
'
;
import
{
faviconDataUrl
,
overlayDataUrl
}
from
'
../lib/utils/mock_data
'
;
import
{
faviconDataUrl
,
overlayDataUrl
}
from
'
../lib/utils/mock_data
'
;
import
{
SUCCESS
}
from
'
~/vue_merge_request_widget/components/deployment/constants
'
;
import
{
SUCCESS
}
from
'
~/vue_merge_request_widget/components/deployment/constants
'
;
jest
.
mock
(
'
~/smart_interval
'
);
const
returnPromise
=
data
=>
const
returnPromise
=
data
=>
new
Promise
(
resolve
=>
{
new
Promise
(
resolve
=>
{
resolve
({
resolve
({
...
@@ -26,7 +28,6 @@ describe('mrWidgetOptions', () => {
...
@@ -26,7 +28,6 @@ describe('mrWidgetOptions', () => {
const
COLLABORATION_MESSAGE
=
'
Allows commits from members who can merge to the target branch
'
;
const
COLLABORATION_MESSAGE
=
'
Allows commits from members who can merge to the target branch
'
;
beforeEach
(()
=>
{
beforeEach
(()
=>
{
jasmine
.
clock
().
install
();
// Prevent component mounting
// Prevent component mounting
delete
mrWidgetOptions
.
el
;
delete
mrWidgetOptions
.
el
;
...
@@ -41,9 +42,7 @@ describe('mrWidgetOptions', () => {
...
@@ -41,9 +42,7 @@ describe('mrWidgetOptions', () => {
});
});
afterEach
(()
=>
{
afterEach
(()
=>
{
jasmine
.
clock
().
uninstall
();
mock
.
restore
();
mock
.
restore
();
vm
.
$destroy
();
vm
.
$destroy
();
vm
=
null
;
vm
=
null
;
...
@@ -59,11 +58,13 @@ describe('mrWidgetOptions', () => {
...
@@ -59,11 +58,13 @@ describe('mrWidgetOptions', () => {
vm
=
mountComponent
(
MrWidgetOptions
,
{
vm
=
mountComponent
(
MrWidgetOptions
,
{
mrData
:
{
...
mockData
},
mrData
:
{
...
mockData
},
});
});
return
axios
.
waitForAll
();
};
};
describe
(
'
default
'
,
()
=>
{
describe
(
'
default
'
,
()
=>
{
beforeEach
(()
=>
{
beforeEach
(()
=>
{
createComponent
();
return
createComponent
();
});
});
describe
(
'
data
'
,
()
=>
{
describe
(
'
data
'
,
()
=>
{
...
@@ -259,9 +260,9 @@ describe('mrWidgetOptions', () => {
...
@@ -259,9 +260,9 @@ describe('mrWidgetOptions', () => {
describe
(
'
methods
'
,
()
=>
{
describe
(
'
methods
'
,
()
=>
{
describe
(
'
checkStatus
'
,
()
=>
{
describe
(
'
checkStatus
'
,
()
=>
{
it
(
'
should tell service to check status
'
,
()
=>
{
it
(
'
should tell service to check status
'
,
()
=>
{
spyOn
(
vm
.
service
,
'
checkStatus
'
).
and
.
r
eturnValue
(
returnPromise
(
mockData
));
jest
.
spyOn
(
vm
.
service
,
'
checkStatus
'
).
mockR
eturnValue
(
returnPromise
(
mockData
));
spyOn
(
vm
.
mr
,
'
setData
'
);
jest
.
spyOn
(
vm
.
mr
,
'
setData
'
).
mockImplementation
(()
=>
{}
);
spyOn
(
vm
,
'
handleNotification
'
);
jest
.
spyOn
(
vm
,
'
handleNotification
'
).
mockImplementation
(()
=>
{}
);
let
isCbExecuted
=
false
;
let
isCbExecuted
=
false
;
const
cb
=
()
=>
{
const
cb
=
()
=>
{
...
@@ -281,33 +282,33 @@ describe('mrWidgetOptions', () => {
...
@@ -281,33 +282,33 @@ describe('mrWidgetOptions', () => {
describe
(
'
initPolling
'
,
()
=>
{
describe
(
'
initPolling
'
,
()
=>
{
it
(
'
should call SmartInterval
'
,
()
=>
{
it
(
'
should call SmartInterval
'
,
()
=>
{
spyOn
(
vm
,
'
checkStatus
'
).
and
.
returnValue
(
Promise
.
resolve
());
vm
.
initPolling
();
vm
.
initPolling
();
expect
(
vm
.
checkStatus
).
not
.
toHaveBeenCalled
();
expect
(
SmartInterval
).
toHaveBeenCalledWith
(
expect
.
objectContaining
({
jasmine
.
clock
().
tick
(
10000
);
callback
:
vm
.
checkStatus
,
}),
expect
(
vm
.
pollingInterval
).
toBeDefined
();
);
expect
(
vm
.
checkStatus
).
toHaveBeenCalled
();
});
});
});
});
describe
(
'
initDeploymentsPolling
'
,
()
=>
{
describe
(
'
initDeploymentsPolling
'
,
()
=>
{
it
(
'
should call SmartInterval
'
,
()
=>
{
it
(
'
should call SmartInterval
'
,
()
=>
{
spyOn
(
vm
,
'
fetchDeployments
'
).
and
.
returnValue
(
Promise
.
resolve
());
vm
.
initDeploymentsPolling
();
vm
.
initDeploymentsPolling
();
expect
(
vm
.
deploymentsInterval
).
toBeDefined
();
expect
(
SmartInterval
).
toHaveBeenCalledWith
(
expect
(
vm
.
fetchDeployments
).
toHaveBeenCalled
();
expect
.
objectContaining
({
callback
:
vm
.
fetchPreMergeDeployments
,
}),
);
});
});
});
});
describe
(
'
fetchDeployments
'
,
()
=>
{
describe
(
'
fetchDeployments
'
,
()
=>
{
it
(
'
should fetch deployments
'
,
()
=>
{
it
(
'
should fetch deployments
'
,
()
=>
{
spyOn
(
vm
.
service
,
'
fetchDeployments
'
).
and
.
returnValue
(
jest
returnPromise
([{
id
:
1
,
status
:
SUCCESS
}]),
.
spyOn
(
vm
.
service
,
'
fetchDeployments
'
)
);
.
mockReturnValue
(
returnPromise
([{
id
:
1
,
status
:
SUCCESS
}])
);
vm
.
fetchPreMergeDeployments
();
vm
.
fetchPreMergeDeployments
();
...
@@ -321,9 +322,9 @@ describe('mrWidgetOptions', () => {
...
@@ -321,9 +322,9 @@ describe('mrWidgetOptions', () => {
describe
(
'
fetchActionsContent
'
,
()
=>
{
describe
(
'
fetchActionsContent
'
,
()
=>
{
it
(
'
should fetch content of Cherry Pick and Revert modals
'
,
()
=>
{
it
(
'
should fetch content of Cherry Pick and Revert modals
'
,
()
=>
{
spyOn
(
vm
.
service
,
'
fetchMergeActionsContent
'
).
and
.
returnValue
(
jest
returnPromise
(
'
hello world
'
),
.
spyOn
(
vm
.
service
,
'
fetchMergeActionsContent
'
)
);
.
mockReturnValue
(
returnPromise
(
'
hello world
'
)
);
vm
.
fetchActionsContent
();
vm
.
fetchActionsContent
();
...
@@ -335,59 +336,48 @@ describe('mrWidgetOptions', () => {
...
@@ -335,59 +336,48 @@ describe('mrWidgetOptions', () => {
});
});
describe
(
'
bindEventHubListeners
'
,
()
=>
{
describe
(
'
bindEventHubListeners
'
,
()
=>
{
it
(
'
should bind eventHub listeners
'
,
()
=>
{
it
.
each
`
spyOn
(
vm
,
'
checkStatus
'
).
and
.
returnValue
(()
=>
{});
event | method | methodArgs
spyOn
(
vm
.
service
,
'
checkStatus
'
).
and
.
returnValue
(
returnPromise
(
mockData
));
${
'
MRWidgetUpdateRequested
'
}
|
${
'
checkStatus
'
}
|
${
x
=>
[
x
]}
spyOn
(
vm
,
'
fetchActionsContent
'
);
${
'
MRWidgetRebaseSuccess
'
}
|
${
'
checkStatus
'
}
|
${
x
=>
[
x
,
true
]}
spyOn
(
vm
.
mr
,
'
setData
'
);
${
'
FetchActionsContent
'
}
|
${
'
fetchActionsContent
'
}
|
${()
=>
[]}
spyOn
(
vm
,
'
resumePolling
'
);
${
'
EnablePolling
'
}
|
${
'
resumePolling
'
}
|
${()
=>
[]}
spyOn
(
vm
,
'
stopPolling
'
);
${
'
DisablePolling
'
}
|
${
'
stopPolling
'
}
|
${()
=>
[]}
spyOn
(
eventHub
,
'
$on
'
).
and
.
callThrough
();
`
(
'
should bind to $event
'
,
({
event
,
method
,
methodArgs
})
=>
{
jest
.
spyOn
(
vm
,
method
).
mockImplementation
();
return
waitForPromises
().
then
(()
=>
{
eventHub
.
$emit
(
'
SetBranchRemoveFlag
'
,
[
'
flag
'
]);
expect
(
vm
.
mr
.
isRemovingSourceBranch
).
toEqual
(
'
flag
'
);
eventHub
.
$emit
(
'
FailedToMerge
'
);
expect
(
vm
.
mr
.
state
).
toEqual
(
'
failedToMerge
'
);
const
eventArg
=
{};
eventHub
.
$emit
(
event
,
eventArg
);
eventHub
.
$emit
(
'
UpdateWidgetData
'
,
mockData
);
expect
(
vm
[
method
]).
toHaveBeenCalledWith
(...
methodArgs
(
eventArg
));
});
expect
(
vm
.
mr
.
setData
).
toHaveBeenCalledWith
(
mockData
);
eventHub
.
$emit
(
'
EnablePolling
'
);
expect
(
vm
.
resumePolling
).
toHaveBeenCalled
();
eventHub
.
$emit
(
'
DisablePolling
'
);
it
(
'
should bind to SetBranchRemoveFlag
'
,
()
=>
{
expect
(
vm
.
mr
.
isRemovingSourceBranch
).
toBe
(
false
);
expect
(
vm
.
stopPolling
).
toHaveBeenCalled
(
);
eventHub
.
$emit
(
'
SetBranchRemoveFlag
'
,
[
true
]
);
const
listenersWithServiceRequest
=
{
expect
(
vm
.
mr
.
isRemovingSourceBranch
).
toBe
(
true
);
MRWidgetUpdateRequested
:
true
,
});
FetchActionsContent
:
true
,
};
const
allArgs
=
eventHub
.
$on
.
calls
.
allArgs
();
it
(
'
should bind to FailedToMerge
'
,
()
=>
{
allArgs
.
forEach
(
params
=>
{
vm
.
mr
.
state
=
''
;
const
eventName
=
params
[
0
];
vm
.
mr
.
mergeError
=
''
;
const
callback
=
params
[
1
];
if
(
listenersWithServiceRequest
[
eventName
])
{
const
mergeError
=
'
Something bad happened!
'
;
listenersWithServiceRequest
[
eventName
]
=
callback
;
eventHub
.
$emit
(
'
FailedToMerge
'
,
mergeError
);
}
});
listenersWithServiceRequest
.
MRWidgetUpdateRequested
();
expect
(
vm
.
mr
.
state
).
toBe
(
'
failedToMerge
'
);
expect
(
vm
.
mr
.
mergeError
).
toBe
(
mergeError
);
});
expect
(
vm
.
checkStatus
).
toHaveBeenCalled
();
it
(
'
should bind to UpdateWidgetData
'
,
()
=>
{
jest
.
spyOn
(
vm
.
mr
,
'
setData
'
).
mockImplementation
();
listenersWithServiceRequest
.
FetchActionsContent
();
const
data
=
{
...
mockData
};
eventHub
.
$emit
(
'
UpdateWidgetData
'
,
data
);
expect
(
vm
.
fetchActionsContent
).
toHaveBeenCalled
();
expect
(
vm
.
mr
.
setData
).
toHaveBeenCalledWith
(
data
);
});
});
});
});
});
...
@@ -419,8 +409,8 @@ describe('mrWidgetOptions', () => {
...
@@ -419,8 +409,8 @@ describe('mrWidgetOptions', () => {
expect
(
faviconElement
.
getAttribute
(
'
href
'
)).
not
.
toEqual
(
null
);
expect
(
faviconElement
.
getAttribute
(
'
href
'
)).
not
.
toEqual
(
null
);
expect
(
faviconElement
.
getAttribute
(
'
href
'
)).
not
.
toEqual
(
overlayDataUrl
);
expect
(
faviconElement
.
getAttribute
(
'
href
'
)).
not
.
toEqual
(
overlayDataUrl
);
expect
(
faviconElement
.
getAttribute
(
'
href
'
)).
not
.
toEqual
(
faviconDataUrl
);
expect
(
faviconElement
.
getAttribute
(
'
href
'
)).
not
.
toEqual
(
faviconDataUrl
);
done
();
})
})
.
then
(
done
)
.
catch
(
done
.
fail
);
.
catch
(
done
.
fail
);
});
});
...
@@ -443,7 +433,7 @@ describe('mrWidgetOptions', () => {
...
@@ -443,7 +433,7 @@ describe('mrWidgetOptions', () => {
};
};
beforeEach
(()
=>
{
beforeEach
(()
=>
{
spyOn
(
notify
,
'
notifyMe
'
);
jest
.
spyOn
(
notify
,
'
notifyMe
'
).
mockImplementation
(()
=>
{}
);
vm
.
mr
.
ciStatus
=
'
failed
'
;
vm
.
mr
.
ciStatus
=
'
failed
'
;
vm
.
mr
.
gitlabLogo
=
'
logo.png
'
;
vm
.
mr
.
gitlabLogo
=
'
logo.png
'
;
...
@@ -478,25 +468,23 @@ describe('mrWidgetOptions', () => {
...
@@ -478,25 +468,23 @@ describe('mrWidgetOptions', () => {
});
});
describe
(
'
resumePolling
'
,
()
=>
{
describe
(
'
resumePolling
'
,
()
=>
{
it
(
'
should call stopTimer on pollingInterval
'
,
()
=>
it
(
'
should call stopTimer on pollingInterval
'
,
()
=>
{
waitForPromises
().
then
(()
=>
{
jest
.
spyOn
(
vm
.
pollingInterval
,
'
resume
'
).
mockImplementation
(()
=>
{});
spyOn
(
vm
.
pollingInterval
,
'
resume
'
);
vm
.
resumePolling
();
vm
.
resumePolling
();
expect
(
vm
.
pollingInterval
.
resume
).
toHaveBeenCalled
();
expect
(
vm
.
pollingInterval
.
resume
).
toHaveBeenCalled
();
})
);
}
);
});
});
describe
(
'
stopPolling
'
,
()
=>
{
describe
(
'
stopPolling
'
,
()
=>
{
it
(
'
should call stopTimer on pollingInterval
'
,
()
=>
it
(
'
should call stopTimer on pollingInterval
'
,
()
=>
{
waitForPromises
().
then
(()
=>
{
jest
.
spyOn
(
vm
.
pollingInterval
,
'
stopTimer
'
).
mockImplementation
(()
=>
{});
spyOn
(
vm
.
pollingInterval
,
'
stopTimer
'
);
vm
.
stopPolling
();
vm
.
stopPolling
();
expect
(
vm
.
pollingInterval
.
stopTimer
).
toHaveBeenCalled
();
expect
(
vm
.
pollingInterval
.
stopTimer
).
toHaveBeenCalled
();
})
);
}
);
});
});
});
});
...
@@ -814,8 +802,12 @@ describe('mrWidgetOptions', () => {
...
@@ -814,8 +802,12 @@ describe('mrWidgetOptions', () => {
describe
(
'
given suggestPipeline feature flag is enabled
'
,
()
=>
{
describe
(
'
given suggestPipeline feature flag is enabled
'
,
()
=>
{
beforeEach
(()
=>
{
beforeEach
(()
=>
{
// This is needed because some grandchildren Bootstrap components throw warnings
// https://gitlab.com/gitlab-org/gitlab/issues/208458
jest
.
spyOn
(
console
,
'
warn
'
).
mockImplementation
();
gon
.
features
=
{
suggestPipeline
:
true
};
gon
.
features
=
{
suggestPipeline
:
true
};
createComponent
();
return
createComponent
();
});
});
it
(
'
should suggest pipelines when none exist
'
,
()
=>
{
it
(
'
should suggest pipelines when none exist
'
,
()
=>
{
...
...
spec/javascripts/vue_mr_widget/mock_data.js
View file @
a5e3969d
import
{
SUCCESS
}
from
'
~/vue_merge_request_widget/components/deployment/constants
'
;
export
{
default
}
from
'
../../frontend/vue_mr_widget/mock_data
'
;
export
*
from
'
../../frontend/vue_mr_widget/mock_data
'
;
export
default
{
id
:
132
,
iid
:
22
,
assignee_id
:
null
,
author_id
:
1
,
description
:
''
,
lock_version
:
null
,
milestone_id
:
null
,
position
:
0
,
state
:
'
merged
'
,
title
:
'
Update README.md
'
,
updated_by_id
:
null
,
created_at
:
'
2017-04-07T12:27:26.718Z
'
,
updated_at
:
'
2017-04-07T15:39:25.852Z
'
,
time_estimate
:
0
,
total_time_spent
:
0
,
human_access
:
'
Maintainer
'
,
human_time_estimate
:
null
,
human_total_time_spent
:
null
,
in_progress_merge_commit_sha
:
null
,
merge_commit_sha
:
'
53027d060246c8f47e4a9310fb332aa52f221775
'
,
short_merge_commit_sha
:
'
53027d06
'
,
merge_error
:
null
,
merge_params
:
{
force_remove_source_branch
:
null
,
},
merge_status
:
'
can_be_merged
'
,
merge_user_id
:
null
,
pipelines_empty_svg_path
:
'
/path/to/svg
'
,
source_branch
:
'
daaaa
'
,
source_branch_link
:
'
daaaa
'
,
source_project_id
:
19
,
source_project_full_path
:
'
/group1/project1
'
,
target_branch
:
'
master
'
,
target_project_id
:
19
,
target_project_full_path
:
'
/group2/project2
'
,
merge_request_add_ci_config_path
:
'
/group2/project2/new/pipeline
'
,
metrics
:
{
merged_by
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
merged_at
:
'
2017-04-07T15:39:25.696Z
'
,
closed_by
:
null
,
closed_at
:
null
,
},
author
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
merge_user
:
null
,
diff_head_sha
:
'
104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
diff_head_commit_short_id
:
'
104096c5
'
,
default_merge_commit_message
:
"
Merge branch 'daaaa' into 'master'
\n\n
Update README.md
\n\n
See merge request !22
"
,
pipeline
:
{
id
:
172
,
user
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
active
:
false
,
coverage
:
'
92.16
'
,
path
:
'
/root/acets-app/pipelines/172
'
,
details
:
{
status
:
{
icon
:
'
status_success
'
,
favicon
:
'
favicon_status_success
'
,
text
:
'
passed
'
,
label
:
'
passed
'
,
group
:
'
success
'
,
has_details
:
true
,
details_path
:
'
/root/acets-app/pipelines/172
'
,
},
duration
:
null
,
finished_at
:
'
2017-04-07T14:00:14.256Z
'
,
stages
:
[
{
name
:
'
build
'
,
title
:
'
build: failed
'
,
status
:
{
icon
:
'
status_failed
'
,
favicon
:
'
favicon_status_failed
'
,
text
:
'
failed
'
,
label
:
'
failed
'
,
group
:
'
failed
'
,
has_details
:
true
,
details_path
:
'
/root/acets-app/pipelines/172#build
'
,
},
path
:
'
/root/acets-app/pipelines/172#build
'
,
dropdown_path
:
'
/root/acets-app/pipelines/172/stage.json?stage=build
'
,
},
{
name
:
'
review
'
,
title
:
'
review: skipped
'
,
status
:
{
icon
:
'
status_skipped
'
,
favicon
:
'
favicon_status_skipped
'
,
text
:
'
skipped
'
,
label
:
'
skipped
'
,
group
:
'
skipped
'
,
has_details
:
true
,
details_path
:
'
/root/acets-app/pipelines/172#review
'
,
},
path
:
'
/root/acets-app/pipelines/172#review
'
,
dropdown_path
:
'
/root/acets-app/pipelines/172/stage.json?stage=review
'
,
},
],
artifacts
:
[],
manual_actions
:
[
{
name
:
'
stop_review
'
,
path
:
'
/root/acets-app/builds/1427/play
'
,
playable
:
false
,
},
],
},
flags
:
{
latest
:
false
,
triggered
:
false
,
stuck
:
false
,
yaml_errors
:
false
,
retryable
:
true
,
cancelable
:
false
,
merge_request_pipeline
:
false
,
detached_merge_request_pipeline
:
true
,
},
ref
:
{
name
:
'
daaaa
'
,
path
:
'
/root/acets-app/tree/daaaa
'
,
tag
:
false
,
branch
:
true
,
},
merge_request
:
{
iid
:
1
,
path
:
'
/root/detached-merge-request-pipelines/-/merge_requests/1
'
,
title
:
'
Update README.md
'
,
source_branch
:
'
feature-1
'
,
source_branch_path
:
'
/root/detached-merge-request-pipelines/branches/feature-1
'
,
target_branch
:
'
master
'
,
target_branch_path
:
'
/root/detached-merge-request-pipelines/branches/master
'
,
},
commit
:
{
id
:
'
104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
short_id
:
'
104096c5
'
,
title
:
'
Update README.md
'
,
created_at
:
'
2017-04-07T15:27:18.000+03:00
'
,
parent_ids
:
[
'
2396536178668d8930c29d904e53bd4d06228b32
'
],
message
:
'
Update README.md
'
,
author_name
:
'
Administrator
'
,
author_email
:
'
admin@example.com
'
,
authored_date
:
'
2017-04-07T15:27:18.000+03:00
'
,
committer_name
:
'
Administrator
'
,
committer_email
:
'
admin@example.com
'
,
committed_date
:
'
2017-04-07T15:27:18.000+03:00
'
,
author
:
{
name
:
'
Administrator
'
,
username
:
'
root
'
,
id
:
1
,
state
:
'
active
'
,
avatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
web_url
:
'
http://localhost:3000/root
'
,
},
author_gravatar_url
:
'
https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon
'
,
commit_url
:
'
http://localhost:3000/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
commit_path
:
'
/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d
'
,
},
retry_path
:
'
/root/acets-app/pipelines/172/retry
'
,
created_at
:
'
2017-04-07T12:27:19.520Z
'
,
updated_at
:
'
2017-04-07T15:28:44.800Z
'
,
},
pipelineCoverageDelta
:
'
15.25
'
,
work_in_progress
:
false
,
source_branch_exists
:
false
,
mergeable_discussions_state
:
true
,
conflicts_can_be_resolved_in_ui
:
false
,
branch_missing
:
true
,
commits_count
:
1
,
has_conflicts
:
false
,
can_be_merged
:
true
,
has_ci
:
true
,
ci_status
:
'
success
'
,
pipeline_status_path
:
'
/root/acets-app/-/merge_requests/22/pipeline_status
'
,
issues_links
:
{
closing
:
''
,
mentioned_but_not_closing
:
''
,
},
current_user
:
{
can_resolve_conflicts
:
true
,
can_remove_source_branch
:
false
,
can_revert_on_current_merge_request
:
true
,
can_cherry_pick_on_current_merge_request
:
true
,
},
target_branch_path
:
'
/root/acets-app/branches/master
'
,
source_branch_path
:
'
/root/acets-app/branches/daaaa
'
,
conflict_resolution_ui_path
:
'
/root/acets-app/-/merge_requests/22/conflicts
'
,
remove_wip_path
:
'
/root/acets-app/-/merge_requests/22/remove_wip
'
,
cancel_auto_merge_path
:
'
/root/acets-app/-/merge_requests/22/cancel_auto_merge
'
,
create_issue_to_resolve_discussions_path
:
'
/root/acets-app/-/issues/new?merge_request_to_resolve_discussions_of=22
'
,
merge_path
:
'
/root/acets-app/-/merge_requests/22/merge
'
,
cherry_pick_in_fork_path
:
'
/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+revert+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1
'
,
revert_in_fork_path
:
'
/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+cherry-pick+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1
'
,
email_patches_path
:
'
/root/acets-app/-/merge_requests/22.patch
'
,
plain_diff_path
:
'
/root/acets-app/-/merge_requests/22.diff
'
,
merge_request_basic_path
:
'
/root/acets-app/-/merge_requests/22.json?serializer=basic
'
,
merge_request_widget_path
:
'
/root/acets-app/-/merge_requests/22/widget.json
'
,
merge_request_cached_widget_path
:
'
/cached.json
'
,
merge_check_path
:
'
/root/acets-app/-/merge_requests/22/merge_check
'
,
ci_environments_status_url
:
'
/root/acets-app/-/merge_requests/22/ci_environments_status
'
,
project_archived
:
false
,
default_merge_commit_message_with_description
:
"
Merge branch 'daaaa' into 'master'
\n\n
Update README.md
\n\n
See merge request !22
"
,
default_squash_commit_message
:
'
Test squash commit message
'
,
diverged_commits_count
:
0
,
only_allow_merge_if_pipeline_succeeds
:
false
,
commit_change_content_path
:
'
/root/acets-app/-/merge_requests/22/commit_change_content
'
,
merge_commit_path
:
'
http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775
'
,
troubleshooting_docs_path
:
'
help
'
,
merge_request_pipelines_docs_path
:
'
/help/ci/merge_request_pipelines/index.md
'
,
merge_train_when_pipeline_succeeds_docs_path
:
'
/help/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/#startadd-to-merge-train-when-pipeline-succeeds
'
,
squash
:
true
,
visual_review_app_available
:
true
,
merge_trains_enabled
:
true
,
merge_trains_count
:
3
,
merge_train_index
:
1
,
};
export
const
mockStore
=
{
pipeline
:
{
id
:
0
,
details
:
{
status
:
{
details_path
:
'
/root/review-app-tester/pipelines/66
'
,
favicon
:
'
/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png
'
,
group
:
'
success-with-warnings
'
,
has_details
:
true
,
icon
:
'
status_warning
'
,
illustration
:
null
,
label
:
'
passed with warnings
'
,
text
:
'
passed
'
,
tooltip
:
'
passed
'
,
},
},
flags
:
{},
ref
:
{},
},
mergePipeline
:
{
id
:
1
,
details
:
{
status
:
{
details_path
:
'
/root/review-app-tester/pipelines/66
'
,
favicon
:
'
/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png
'
,
group
:
'
success-with-warnings
'
,
has_details
:
true
,
icon
:
'
status_warning
'
,
illustration
:
null
,
label
:
'
passed with warnings
'
,
text
:
'
passed
'
,
tooltip
:
'
passed
'
,
},
},
flags
:
{},
ref
:
{},
},
targetBranch
:
'
target-branch
'
,
sourceBranch
:
'
source-branch
'
,
sourceBranchLink
:
'
source-branch-link
'
,
deployments
:
[
{
id
:
0
,
name
:
'
bogus
'
,
external_url
:
'
https://fake.com
'
,
external_url_formatted
:
'
https://fake.com
'
,
status
:
SUCCESS
,
},
{
id
:
1
,
name
:
'
bogus-docs
'
,
external_url
:
'
https://fake.com
'
,
external_url_formatted
:
'
https://fake.com
'
,
status
:
SUCCESS
,
},
],
postMergeDeployments
:
[
{
id
:
0
,
name
:
'
prod
'
,
status
:
SUCCESS
},
{
id
:
1
,
name
:
'
prod-docs
'
,
status
:
SUCCESS
},
],
troubleshootingDocsPath
:
'
troubleshooting-docs-path
'
,
ciStatus
:
'
ci-status
'
,
hasCI
:
true
,
exposedArtifactsPath
:
'
exposed_artifacts.json
'
,
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment