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
56979d42
Commit
56979d42
authored
Aug 31, 2020
by
GitLab Bot
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of gitlab-org/gitlab master
parents
b598ad00
16d095e2
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
214 additions
and
80 deletions
+214
-80
app/assets/javascripts/lib/utils/text_utility.js
app/assets/javascripts/lib/utils/text_utility.js
+2
-2
ee/app/assets/javascripts/dast_profiles/components/dast_profiles.vue
...ts/javascripts/dast_profiles/components/dast_profiles.vue
+38
-15
ee/app/assets/javascripts/dast_profiles/dast_profiles_bundle.js
.../assets/javascripts/dast_profiles/dast_profiles_bundle.js
+5
-2
ee/app/assets/javascripts/dast_profiles/settings/profiles.js
ee/app/assets/javascripts/dast_profiles/settings/profiles.js
+33
-0
ee/app/controllers/projects/dast_profiles_controller.rb
ee/app/controllers/projects/dast_profiles_controller.rb
+3
-0
ee/app/views/projects/dast_profiles/index.html.haml
ee/app/views/projects/dast_profiles/index.html.haml
+3
-2
ee/changelogs/unreleased/241362-dast-scanner-profile-library-implementation-iteration-1-add-new.yml
...er-profile-library-implementation-iteration-1-add-new.yml
+5
-0
ee/spec/frontend/dast_profiles/components/dast_profiles_spec.js
...c/frontend/dast_profiles/components/dast_profiles_spec.js
+52
-7
ee/spec/views/projects/dast_profiles/index.html.haml_spec.rb
ee/spec/views/projects/dast_profiles/index.html.haml_spec.rb
+4
-0
locale/gitlab.pot
locale/gitlab.pot
+8
-2
spec/frontend/lib/utils/text_utility_spec.js
spec/frontend/lib/utils/text_utility_spec.js
+2
-1
spec/models/merge_request_spec.rb
spec/models/merge_request_spec.rb
+59
-49
No files found.
app/assets/javascripts/lib/utils/text_utility.js
View file @
56979d42
...
...
@@ -283,7 +283,7 @@ const unicodeConversion = [
[
/
[
ÌÍÎÏĨĪĬĮİ
]
/g
,
'
I
'
],
[
/
[
Ððĥħ
]
/g
,
'
h
'
],
[
/
[
ÑŃŅŇʼn
]
/g
,
'
N
'
],
[
/
[
ÒÓÔÕ
Ö
ØŌŎŐ
]
/g
,
'
O
'
],
[
/
[
ÒÓÔÕØŌŎŐ
]
/g
,
'
O
'
],
[
/
[
ÙÚÛŨŪŬŮŰŲ
]
/g
,
'
U
'
],
[
/
[
ÝŶŸ
]
/g
,
'
Y
'
],
[
/
[
Þñþńņň
]
/g
,
'
n
'
],
...
...
@@ -293,7 +293,7 @@ const unicodeConversion = [
[
/
[
çćĉċč
]
/g
,
'
c
'
],
[
/
[
èéêëēĕėęě
]
/g
,
'
e
'
],
[
/
[
ìíîïĩīĭį
]
/g
,
'
i
'
],
[
/
[
òóôõ
ö
øōŏő
]
/g
,
'
o
'
],
[
/
[
òóôõøōŏő
]
/g
,
'
o
'
],
[
/
[
ùúûũūŭůűų
]
/g
,
'
u
'
],
[
/
[
ýÿŷ
]
/g
,
'
y
'
],
[
/
[
ĎĐ
]
/g
,
'
D
'
],
...
...
ee/app/assets/javascripts/dast_profiles/components/dast_profiles.vue
View file @
56979d42
<
script
>
import
*
as
Sentry
from
'
@sentry/browser
'
;
import
{
Gl
Button
,
GlTab
,
GlTabs
}
from
'
@gitlab/ui
'
;
import
{
Gl
Dropdown
,
GlDropdownItem
,
GlTab
,
GlTabs
}
from
'
@gitlab/ui
'
;
import
{
s__
}
from
'
~/locale
'
;
import
glFeatureFlagMixin
from
'
~/vue_shared/mixins/gl_feature_flags_mixin
'
;
import
ProfilesList
from
'
./dast_profiles_list.vue
'
;
import
dastSiteProfilesQuery
from
'
../graphql/dast_site_profiles.query.graphql
'
;
import
dastSiteProfilesDelete
from
'
../graphql/dast_site_profiles_delete.mutation.graphql
'
;
import
*
as
cacheUtils
from
'
../graphql/cache_utils
'
;
import
{
getProfileSettings
}
from
'
../settings/profiles
'
;
export
default
{
components
:
{
GlButton
,
GlDropdown
,
GlDropdownItem
,
GlTab
,
GlTabs
,
ProfilesList
,
},
mixins
:
[
glFeatureFlagMixin
()],
props
:
{
newDastSiteProfilePath
:
{
type
:
String
,
createNewProfilePaths
:
{
type
:
Object
,
required
:
true
,
validator
:
({
scannerProfile
,
siteProfile
})
=>
Boolean
(
scannerProfile
)
&&
Boolean
(
siteProfile
),
},
projectFullPath
:
{
type
:
String
,
...
...
@@ -60,6 +66,16 @@ export default {
},
},
computed
:
{
profileSettings
()
{
const
{
glFeatures
,
createNewProfilePaths
}
=
this
;
return
getProfileSettings
(
{
createNewProfilePaths
,
},
glFeatures
,
);
},
hasMoreSiteProfiles
()
{
return
this
.
siteProfilesPageInfo
.
hasNextPage
;
},
...
...
@@ -152,6 +168,11 @@ export default {
},
profilesPerPage
:
10
,
i18n
:
{
heading
:
s__
(
'
DastProfiles|Manage Profiles
'
),
newProfileDropdownLabel
:
s__
(
'
DastProfiles|New Profile
'
),
subHeading
:
s__
(
'
DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan.
'
,
),
errorMessages
:
{
fetchNetworkError
:
s__
(
'
DastProfiles|Could not fetch site profiles. Please refresh the page, or try again later.
'
,
...
...
@@ -170,23 +191,25 @@ export default {
<header>
<div
class=
"gl-display-flex gl-align-items-center gl-pt-6 gl-pb-4"
>
<h2
class=
"my-0"
>
{{
s__
(
'
DastProfiles|Manage Profiles
'
)
}}
{{
$options
.
i18n
.
heading
}}
</h2>
<gl-button
:href=
"newDastSiteProfilePath"
category=
"primary"
<gl-dropdown
:text=
"$options.i18n.newProfileDropdownLabel"
variant=
"success"
right
class=
"gl-ml-auto"
>
{{
s__
(
'
DastProfiles|New Site Profile
'
)
}}
</gl-button>
<gl-dropdown-item
v-for=
"
{ i18n, createNewProfilePath, key } in profileSettings"
:key="key"
:href="createNewProfilePath"
>
{{
i18n
.
title
}}
</gl-dropdown-item>
</gl-dropdown>
</div>
<p>
{{
s__
(
'
DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan.
'
,
)
}}
{{
$options
.
i18n
.
subHeading
}}
</p>
</header>
...
...
ee/app/assets/javascripts/dast_profiles/dast_profiles_bundle.js
View file @
56979d42
...
...
@@ -10,11 +10,14 @@ export default () => {
}
const
{
dataset
:
{
newDastSiteProfilePath
,
projectFullPath
},
dataset
:
{
newDastS
cannerProfilePath
,
newDastS
iteProfilePath
,
projectFullPath
},
}
=
el
;
const
props
=
{
newDastSiteProfilePath
,
createNewProfilePaths
:
{
scannerProfile
:
newDastScannerProfilePath
,
siteProfile
:
newDastSiteProfilePath
,
},
projectFullPath
,
};
...
...
ee/app/assets/javascripts/dast_profiles/settings/profiles.js
0 → 100644
View file @
56979d42
import
{
s__
}
from
'
~/locale
'
;
const
hasNoFeatureFlagOrIsEnabled
=
glFeatures
=>
([,
{
featureFlag
}])
=>
{
if
(
!
featureFlag
)
{
return
true
;
}
return
Boolean
(
glFeatures
[
featureFlag
]);
};
export
const
getProfileSettings
=
({
createNewProfilePaths
},
glFeatures
)
=>
{
const
settings
=
{
siteProfiles
:
{
key
:
'
siteProfiles
'
,
createNewProfilePath
:
createNewProfilePaths
.
siteProfile
,
i18n
:
{
title
:
s__
(
'
DastProfiles|Site Profile
'
),
},
},
scannerProfiles
:
{
key
:
'
scannerProfiles
'
,
createNewProfilePath
:
createNewProfilePaths
.
scannerProfile
,
featureFlag
:
'
securityOnDemandScansScannerProfiles
'
,
i18n
:
{
title
:
s__
(
'
DastProfiles|Scanner Profile
'
),
},
},
};
return
Object
.
fromEntries
(
Object
.
entries
(
settings
).
filter
(
hasNoFeatureFlagOrIsEnabled
(
glFeatures
)),
);
};
ee/app/controllers/projects/dast_profiles_controller.rb
View file @
56979d42
...
...
@@ -3,6 +3,9 @@
module
Projects
class
DastProfilesController
<
Projects
::
ApplicationController
before_action
:authorize_read_on_demand_scans!
before_action
do
push_frontend_feature_flag
(
:security_on_demand_scans_scanner_profiles
,
project
,
default_enabled:
false
)
end
def
index
end
...
...
ee/app/views/projects/dast_profiles/index.html.haml
View file @
56979d42
...
...
@@ -2,5 +2,6 @@
-
breadcrumb_title
s_
(
'DastProfiles|Manage profiles'
)
-
page_title
s_
(
'DastProfiles|Manage profiles'
)
.js-dast-profiles
{
data:
{
new_dast_site_profile_path:
new_namespace_project_dast_site_profile_path
(
namespace_id:
@project
.
namespace
,
project_id:
@project
.
path
),
project_full_path:
@project
.
path_with_namespace
}
}
.js-dast-profiles
{
data:
{
new_dast_site_profile_path:
new_project_dast_site_profile_path
(
@project
),
new_dast_scanner_profile_path:
new_project_dast_scanner_profile_path
(
@project
),
project_full_path:
@project
.
path_with_namespace
}
}
ee/changelogs/unreleased/241362-dast-scanner-profile-library-implementation-iteration-1-add-new.yml
0 → 100644
View file @
56979d42
---
title
:
'
DAST
Scanner
Profile
Library:
change
new-profile
button
to
dropdown'
merge_request
:
40469
author
:
type
:
changed
ee/spec/frontend/dast_profiles/components/dast_profiles_spec.js
View file @
56979d42
import
{
mount
,
shallowMount
}
from
'
@vue/test-utils
'
;
import
{
within
}
from
'
@testing-library/dom
'
;
import
{
merge
}
from
'
lodash
'
;
import
{
GlDropdown
}
from
'
@gitlab/ui
'
;
import
DastProfiles
from
'
ee/dast_profiles/components/dast_profiles.vue
'
;
import
DastProfilesList
from
'
ee/dast_profiles/components/dast_profiles_list.vue
'
;
const
TEST_NEW_DAST_SCANNER_PROFILE_PATH
=
'
/-/on_demand_scans/scanner_profiles/new
'
;
const
TEST_NEW_DAST_SITE_PROFILE_PATH
=
'
/-/on_demand_scans/site_profiles/new
'
;
const
TEST_PROJECT_FULL_PATH
=
'
/namespace/project
'
;
...
...
@@ -12,7 +14,10 @@ describe('EE - DastProfiles', () => {
const
createComponentFactory
=
(
mountFn
=
shallowMount
)
=>
(
options
=
{})
=>
{
const
defaultProps
=
{
newDastSiteProfilePath
:
TEST_NEW_DAST_SITE_PROFILE_PATH
,
createNewProfilePaths
:
{
scannerProfile
:
TEST_NEW_DAST_SCANNER_PROFILE_PATH
,
siteProfile
:
TEST_NEW_DAST_SITE_PROFILE_PATH
,
},
projectFullPath
:
TEST_PROJECT_FULL_PATH
,
};
...
...
@@ -43,28 +48,68 @@ describe('EE - DastProfiles', () => {
const
createComponent
=
createComponentFactory
();
const
createFullComponent
=
createComponentFactory
(
mount
);
const
withFeatureFlag
=
(
featureFlagName
,
{
enabled
,
disabled
})
=>
{
it
.
each
([
true
,
false
])(
`with
${
featureFlagName
}
enabled: "%s"`
,
featureFlagStatus
=>
{
createComponent
({
provide
:
{
glFeatures
:
{
[
featureFlagName
]:
featureFlagStatus
,
},
},
});
if
(
featureFlagStatus
)
{
enabled
();
}
else
{
disabled
();
}
});
};
const
withinComponent
=
()
=>
within
(
wrapper
.
element
);
const
getSiteProfilesComponent
=
()
=>
wrapper
.
find
(
DastProfilesList
);
const
getDropdownComponent
=
()
=>
wrapper
.
find
(
GlDropdown
);
const
getSiteProfilesDropdownItem
=
text
=>
within
(
getDropdownComponent
().
element
).
queryByText
(
text
);
afterEach
(()
=>
{
wrapper
.
destroy
();
});
describe
(
'
header
'
,
()
=>
{
beforeEach
(
()
=>
{
it
(
'
shows a heading that describes the purpose of the page
'
,
()
=>
{
createFullComponent
();
});
it
(
'
shows a heading that describes the purpose of the page
'
,
()
=>
{
const
heading
=
withinComponent
().
getByRole
(
'
heading
'
,
{
name
:
/manage profiles/i
});
expect
(
heading
).
not
.
toBe
(
null
);
});
it
(
`shows a "New Site Profile" anchor that links to
${
TEST_NEW_DAST_SITE_PROFILE_PATH
}
`
,
()
=>
{
const
newProfileButton
=
withinComponent
().
getByRole
(
'
link
'
,
{
name
:
/new site profile/i
});
it
(
'
has a "New Profile" dropdown menu
'
,
()
=>
{
createComponent
();
expect
(
getDropdownComponent
().
props
(
'
text
'
)).
toBe
(
'
New Profile
'
);
});
it
(
`shows a "Site Profile" dropdown item that links to
${
TEST_NEW_DAST_SITE_PROFILE_PATH
}
`
,
()
=>
{
createComponent
();
expect
(
newProfileButton
.
getAttribute
(
'
href
'
)).
toBe
(
TEST_NEW_DAST_SITE_PROFILE_PATH
);
expect
(
getSiteProfilesDropdownItem
(
'
Site Profile
'
).
getAttribute
(
'
href
'
)).
toBe
(
TEST_NEW_DAST_SITE_PROFILE_PATH
,
);
});
describe
(
`shows a "Scanner Profile" dropdown item that links to
${
TEST_NEW_DAST_SCANNER_PROFILE_PATH
}
`
,
()
=>
{
withFeatureFlag
(
'
securityOnDemandScansScannerProfiles
'
,
{
enabled
:
()
=>
{
expect
(
getSiteProfilesDropdownItem
(
'
Scanner Profile
'
).
getAttribute
(
'
href
'
)).
toBe
(
TEST_NEW_DAST_SCANNER_PROFILE_PATH
,
);
},
disabled
:
()
=>
{
expect
(
getSiteProfilesDropdownItem
(
'
Scanner Profile
'
)).
toBe
(
null
);
},
});
});
});
...
...
ee/spec/views/projects/dast_profiles/index.html.haml_spec.rb
View file @
56979d42
...
...
@@ -16,6 +16,10 @@ RSpec.describe "projects/dast_profiles/index", type: :view do
expect
(
rendered
).
to
include
'/on_demand_scans/profiles/dast_site_profiles/new'
end
it
'passes new dast scanner profile path'
do
expect
(
rendered
).
to
include
'/on_demand_scans/profiles/dast_scanner_profiles/new'
end
it
'passes project\'s full path'
do
expect
(
rendered
).
to
include
@project
.
path_with_namespace
end
...
...
locale/gitlab.pot
View file @
56979d42
...
...
@@ -7752,10 +7752,10 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
msgid "DastProfiles|New
Scanner
Profile"
msgid "DastProfiles|New Profile"
msgstr ""
msgid "DastProfiles|New S
ite
Profile"
msgid "DastProfiles|New S
canner
Profile"
msgstr ""
msgid "DastProfiles|New scanner profile"
...
...
@@ -7779,6 +7779,12 @@ msgstr ""
msgid "DastProfiles|Save profile"
msgstr ""
msgid "DastProfiles|Scanner Profile"
msgstr ""
msgid "DastProfiles|Site Profile"
msgstr ""
msgid "DastProfiles|Site Profiles"
msgstr ""
...
...
spec/frontend/lib/utils/text_utility_spec.js
View file @
56979d42
...
...
@@ -218,10 +218,11 @@ describe('text_utility', () => {
it
(
'
replaces Unicode characters
'
,
()
=>
{
expect
(
textUtils
.
convertUnicodeToAscii
(
'
Dĭd söméònê äšk fœŕ Ůnĭċődę?
'
)).
toBe
(
'
Did someone aesk foer Unicode?
'
,
'
Did so
e
meone aesk foer Unicode?
'
,
);
expect
(
textUtils
.
convertUnicodeToAscii
(
"
Jürgen's Projekt
"
)).
toBe
(
"
Juergen's Projekt
"
);
expect
(
textUtils
.
convertUnicodeToAscii
(
'
öäüÖÄÜ
'
)).
toBe
(
'
oeaeueOeAeUe
'
);
});
});
...
...
spec/models/merge_request_spec.rb
View file @
56979d42
...
...
@@ -2,13 +2,16 @@
require
'spec_helper'
RSpec
.
describe
MergeRequest
do
RSpec
.
describe
MergeRequest
,
factory_default: :keep
do
include
RepoHelpers
include
ProjectForksHelper
include
ReactiveCachingHelpers
using
RSpec
::
Parameterized
::
TableSyntax
let_it_be
(
:namespace
)
{
create_default
(
:namespace
)
}
let_it_be
(
:project
,
refind:
true
)
{
create_default
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
)
}
describe
'associations'
do
...
...
@@ -360,7 +363,7 @@ RSpec.describe MergeRequest do
it
'returns merge requests that match the given merge commit'
do
note
=
create
(
:track_mr_picking_note
,
commit_id:
'456abc'
)
create
(
:track_mr_picking_note
,
commit_id:
'456def'
)
create
(
:track_mr_picking_note
,
project:
create
(
:project
),
commit_id:
'456def'
)
expect
(
described_class
.
by_cherry_pick_sha
(
'456abc'
)).
to
eq
([
note
.
noteable
])
end
...
...
@@ -832,7 +835,7 @@ RSpec.describe MergeRequest do
end
context
'with commit diff note'
do
let
(
:other_merge_request
)
{
create
(
:merge_request
)
}
let
(
:other_merge_request
)
{
create
(
:merge_request
,
source_project:
create
(
:project
,
:repository
)
)
}
let!
(
:diff_note
)
do
create
(
:diff_note_on_commit
,
project:
merge_request
.
project
)
...
...
@@ -1031,6 +1034,8 @@ RSpec.describe MergeRequest do
end
describe
'#closes_issues'
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:issue0
)
{
create
:issue
,
project:
subject
.
project
}
let
(
:issue1
)
{
create
:issue
,
project:
subject
.
project
}
...
...
@@ -1038,6 +1043,8 @@ RSpec.describe MergeRequest do
let
(
:commit1
)
{
double
(
'commit1'
,
safe_message:
"Fixes
#{
issue0
.
to_reference
}
"
)
}
let
(
:commit2
)
{
double
(
'commit2'
,
safe_message:
"Fixes
#{
issue1
.
to_reference
}
"
)
}
subject
{
create
(
:merge_request
,
source_project:
project
)
}
before
do
subject
.
project
.
add_developer
(
subject
.
author
)
allow
(
subject
).
to
receive
(
:commits
).
and_return
([
commit0
,
commit1
,
commit2
])
...
...
@@ -1088,6 +1095,8 @@ RSpec.describe MergeRequest do
end
context
'when the project has an external issue tracker'
do
subject
{
create
(
:merge_request
,
source_project:
create
(
:project
,
:repository
))
}
before
do
subject
.
project
.
add_developer
(
subject
.
author
)
commit
=
double
(
:commit
,
safe_message:
'Fixes TEST-3'
)
...
...
@@ -1254,7 +1263,8 @@ RSpec.describe MergeRequest do
end
describe
"#source_branch_exists?"
do
let
(
:merge_request
)
{
subject
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
let
(
:repository
)
{
merge_request
.
source_project
.
repository
}
context
'when the source project is set'
do
...
...
@@ -1730,16 +1740,14 @@ RSpec.describe MergeRequest do
describe
'#has_test_reports?'
do
subject
{
merge_request
.
has_test_reports?
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
context
'when head pipeline has test reports'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
:with_test_reports
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
:with_test_reports
)
}
it
{
is_expected
.
to
be_truthy
}
end
context
'when head pipeline does not have test reports'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
)
}
it
{
is_expected
.
to
be_falsey
}
end
...
...
@@ -1748,16 +1756,14 @@ RSpec.describe MergeRequest do
describe
'#has_accessibility_reports?'
do
subject
{
merge_request
.
has_accessibility_reports?
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
context
'when head pipeline has an accessibility reports'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
:with_accessibility_reports
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
:with_accessibility_reports
)
}
it
{
is_expected
.
to
be_truthy
}
end
context
'when head pipeline does not have accessibility reports'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
)
}
it
{
is_expected
.
to
be_falsey
}
end
...
...
@@ -1766,27 +1772,23 @@ RSpec.describe MergeRequest do
describe
'#has_coverage_reports?'
do
subject
{
merge_request
.
has_coverage_reports?
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
context
'when head pipeline has coverage reports'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
:with_coverage_reports
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
:with_coverage_reports
)
}
it
{
is_expected
.
to
be_truthy
}
end
context
'when head pipeline does not have coverage reports'
do
let
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
)
}
it
{
is_expected
.
to
be_falsey
}
end
end
describe
'#has_terraform_reports?'
do
let_it_be
(
:project
)
{
create
(
:project
,
:repository
)
}
context
'when head pipeline has terraform reports'
do
it
'returns true'
do
merge_request
=
create
(
:merge_request
,
:with_terraform_reports
,
source_project:
project
)
merge_request
=
create
(
:merge_request
,
:with_terraform_reports
)
expect
(
merge_request
.
has_terraform_reports?
).
to
be_truthy
end
...
...
@@ -1794,7 +1796,7 @@ RSpec.describe MergeRequest do
context
'when head pipeline does not have terraform reports'
do
it
'returns false'
do
merge_request
=
create
(
:merge_request
,
source_project:
project
)
merge_request
=
create
(
:merge_request
)
expect
(
merge_request
.
has_terraform_reports?
).
to
be_falsey
end
...
...
@@ -1802,8 +1804,7 @@ RSpec.describe MergeRequest do
end
describe
'#calculate_reactive_cache'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
let
(
:merge_request
)
{
create
(
:merge_request
)
}
subject
{
merge_request
.
calculate_reactive_cache
(
service_class_name
)
}
...
...
@@ -2131,6 +2132,8 @@ RSpec.describe MergeRequest do
end
describe
'#can_be_reverted?'
do
subject
{
create
(
:merge_request
,
source_project:
create
(
:project
,
:repository
))
}
context
'when there is no merge_commit for the MR'
do
before
do
subject
.
metrics
.
update!
(
merged_at:
Time
.
current
.
utc
)
...
...
@@ -2319,8 +2322,6 @@ RSpec.describe MergeRequest do
end
describe
'#participants'
do
let
(
:project
)
{
create
(
:project
,
:public
)
}
let
(
:mr
)
do
create
(
:merge_request
,
source_project:
project
,
target_project:
project
)
end
...
...
@@ -2428,9 +2429,7 @@ RSpec.describe MergeRequest do
end
describe
'#mergeable?'
do
let
(
:project
)
{
create
(
:project
)
}
subject
{
create
(
:merge_request
,
source_project:
project
)
}
subject
{
build_stubbed
(
:merge_request
)
}
it
'returns false if #mergeable_state? is false'
do
expect
(
subject
).
to
receive
(
:mergeable_state?
)
{
false
}
...
...
@@ -2500,9 +2499,7 @@ RSpec.describe MergeRequest do
end
describe
'#mergeable_state?'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
,
source_project:
project
)
}
subject
{
create
(
:merge_request
)
}
it
'checks if merge request can be merged'
do
allow
(
subject
).
to
receive
(
:mergeable_ci_state?
)
{
true
}
...
...
@@ -2617,7 +2614,7 @@ RSpec.describe MergeRequest do
let
(
:pipeline
)
{
create
(
:ci_empty_pipeline
)
}
context
'when it is only allowed to merge when build is green'
do
let
(
:project
)
{
create
(
:project
,
only_allow_merge_if_pipeline_succeeds:
true
)
}
let
_it_be
(
:project
)
{
create
(
:project
,
only_allow_merge_if_pipeline_succeeds:
true
)
}
subject
{
build
(
:merge_request
,
target_project:
project
)
}
...
...
@@ -2658,7 +2655,7 @@ RSpec.describe MergeRequest do
end
context
'when it is only allowed to merge when build is green or skipped'
do
let
(
:project
)
{
create
(
:project
,
only_allow_merge_if_pipeline_succeeds:
true
,
allow_merge_on_skipped_pipeline:
true
)
}
let
_it_be
(
:project
)
{
create
(
:project
,
only_allow_merge_if_pipeline_succeeds:
true
,
allow_merge_on_skipped_pipeline:
true
)
}
subject
{
build
(
:merge_request
,
target_project:
project
)
}
...
...
@@ -2699,7 +2696,7 @@ RSpec.describe MergeRequest do
end
context
'when merges are not restricted to green builds'
do
let
(
:project
)
{
create
(
:project
,
only_allow_merge_if_pipeline_succeeds:
false
)
}
let
_it_be
(
:project
)
{
create
(
:project
,
only_allow_merge_if_pipeline_succeeds:
false
)
}
subject
{
build
(
:merge_request
,
target_project:
project
)
}
...
...
@@ -2743,7 +2740,7 @@ RSpec.describe MergeRequest do
let
(
:merge_request
)
{
create
(
:merge_request_with_diff_notes
,
source_project:
project
)
}
context
'when project.only_allow_merge_if_all_discussions_are_resolved == true'
do
let
(
:project
)
{
create
(
:project
,
:repository
,
only_allow_merge_if_all_discussions_are_resolved:
true
)
}
let
_it_be
(
:project
)
{
create
(
:project
,
:repository
,
only_allow_merge_if_all_discussions_are_resolved:
true
)
}
context
'with all discussions resolved'
do
before
do
...
...
@@ -2992,6 +2989,10 @@ RSpec.describe MergeRequest do
end
describe
'#branch_merge_base_commit'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
,
:with_diffs
,
source_project:
project
)
}
context
'source and target branch exist'
do
it
{
expect
(
subject
.
branch_merge_base_commit
.
sha
).
to
eq
(
'ae73cb07c9eeaf35924a10f713b364d32b2dd34f'
)
}
it
{
expect
(
subject
.
branch_merge_base_commit
).
to
be_a
(
Commit
)
}
...
...
@@ -3011,7 +3012,9 @@ RSpec.describe MergeRequest do
describe
"#diff_refs"
do
context
"with diffs"
do
subject
{
create
(
:merge_request
,
:with_diffs
)
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
,
:with_diffs
,
source_project:
project
)
}
let
(
:expected_diff_refs
)
do
Gitlab
::
Diff
::
DiffRefs
.
new
(
...
...
@@ -3213,7 +3216,8 @@ RSpec.describe MergeRequest do
pipeline
end
let
(
:project
)
{
create
(
:project
,
:public
,
:repository
,
only_allow_merge_if_pipeline_succeeds:
true
)
}
let_it_be
(
:project
)
{
create
(
:project
,
:public
,
:repository
,
only_allow_merge_if_pipeline_succeeds:
true
)
}
let
(
:developer
)
{
create
(
:user
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
...
...
@@ -3307,8 +3311,7 @@ RSpec.describe MergeRequest do
end
describe
'#pipeline_coverage_delta'
do
let!
(
:project
)
{
create
(
:project
,
:repository
)
}
let!
(
:merge_request
)
{
create
(
:merge_request
,
source_project:
project
)
}
let!
(
:merge_request
)
{
create
(
:merge_request
)
}
let!
(
:source_pipeline
)
do
create
(
:ci_pipeline
,
...
...
@@ -3414,7 +3417,9 @@ RSpec.describe MergeRequest do
end
describe
'#merge_request_diff_for'
do
subject
{
create
(
:merge_request
,
importing:
true
)
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
,
importing:
true
,
source_project:
project
)
}
let!
(
:merge_request_diff1
)
{
subject
.
merge_request_diffs
.
create
(
head_commit_sha:
'6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
)
}
let!
(
:merge_request_diff2
)
{
subject
.
merge_request_diffs
.
create
(
head_commit_sha:
nil
)
}
...
...
@@ -3445,9 +3450,10 @@ RSpec.describe MergeRequest do
end
describe
'#version_params_for'
do
subject
{
create
(
:merge_request
,
importing:
true
)
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
,
importing:
true
,
source_project:
project
)
}
let
(
:project
)
{
subject
.
project
}
let!
(
:merge_request_diff1
)
{
subject
.
merge_request_diffs
.
create
(
head_commit_sha:
'6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
)
}
let!
(
:merge_request_diff2
)
{
subject
.
merge_request_diffs
.
create
(
head_commit_sha:
nil
)
}
let!
(
:merge_request_diff3
)
{
subject
.
merge_request_diffs
.
create
(
head_commit_sha:
'5937ac0a7beb003549fc5fd26fc247adbce4a52e'
)
}
...
...
@@ -3478,6 +3484,10 @@ RSpec.describe MergeRequest do
end
describe
'#fetch_ref!'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
subject
{
create
(
:merge_request
,
:with_diffs
,
source_project:
project
)
}
it
'fetches the ref correctly'
do
expect
{
subject
.
target_project
.
repository
.
delete_refs
(
subject
.
ref_path
)
}.
not_to
raise_error
...
...
@@ -3500,8 +3510,10 @@ RSpec.describe MergeRequest do
end
context
'state machine transitions'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
describe
'#unlock_mr'
do
subject
{
create
(
:merge_request
,
state:
'locked'
,
merge_jid:
123
)
}
subject
{
create
(
:merge_request
,
state:
'locked'
,
source_project:
project
,
merge_jid:
123
)
}
it
'updates merge request head pipeline and sets merge_jid to nil'
,
:sidekiq_might_not_need_inline
do
pipeline
=
create
(
:ci_empty_pipeline
,
project:
subject
.
project
,
ref:
subject
.
source_branch
,
sha:
subject
.
source_branch_sha
)
...
...
@@ -3518,7 +3530,7 @@ RSpec.describe MergeRequest do
let
(
:notification_service
)
{
double
(
:notification_service
)
}
let
(
:todo_service
)
{
double
(
:todo_service
)
}
subject
{
create
(
:merge_request
,
state
,
merge_status: :unchecked
)
}
subject
{
create
(
:merge_request
,
state
,
source_project:
project
,
merge_status: :unchecked
)
}
before
do
allow
(
NotificationService
).
to
receive
(
:new
).
and_return
(
notification_service
)
...
...
@@ -3607,7 +3619,7 @@ RSpec.describe MergeRequest do
end
context
'source branch is missing'
do
subject
{
create
(
:merge_request
,
:invalid
,
:opened
,
merge_status: :unchecked
,
target_branch:
'master'
)
}
subject
{
create
(
:merge_request
,
:invalid
,
:opened
,
source_project:
project
,
merge_status: :unchecked
,
target_branch:
'master'
)
}
before
do
allow
(
subject
.
project
.
repository
).
to
receive
(
:can_be_merged?
).
and_call_original
...
...
@@ -3640,10 +3652,8 @@ RSpec.describe MergeRequest do
end
describe
'#should_be_rebased?'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
it
'returns false for the same source and target branches'
do
merge_request
=
create
(
:merge_request
,
source_project:
project
,
target_project:
project
)
merge_request
=
build_stubbed
(
:merge_request
,
source_project:
project
,
target_project:
project
)
expect
(
merge_request
.
should_be_rebased?
).
to
be_falsey
end
...
...
@@ -3658,7 +3668,7 @@ RSpec.describe MergeRequest do
end
with_them
do
let
(
:merge_request
)
{
create
(
:merge_request
)
}
let
(
:merge_request
)
{
build_stubbed
(
:merge_request
)
}
subject
{
merge_request
.
rebase_in_progress?
}
...
...
@@ -3881,7 +3891,7 @@ RSpec.describe MergeRequest do
describe
'#cleanup_refs'
do
subject
{
merge_request
.
cleanup_refs
(
only:
only
)
}
let
(
:merge_request
)
{
build
(
:merge_request
)
}
let
(
:merge_request
)
{
build
(
:merge_request
,
source_project:
create
(
:project
,
:repository
)
)
}
context
'when removing all refs'
do
let
(
:only
)
{
:all
}
...
...
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