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
efad1f1a
Commit
efad1f1a
authored
Sep 21, 2020
by
Brett Walker
Committed by
Heinrich Lee Yu
Sep 21, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored the EntityLeaveService specs
to use shared examples and parameterized specs
parent
151c7fc7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
152 additions
and
143 deletions
+152
-143
spec/services/todos/destroy/entity_leave_service_spec.rb
spec/services/todos/destroy/entity_leave_service_spec.rb
+152
-143
No files found.
spec/services/todos/destroy/entity_leave_service_spec.rb
View file @
efad1f1a
...
...
@@ -3,77 +3,111 @@
require
'spec_helper'
RSpec
.
describe
Todos
::
Destroy
::
EntityLeaveService
do
let
(
:group
)
{
create
(
:group
,
:private
)
}
let
(
:project
)
{
create
(
:project
,
group:
group
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:user2
)
{
create
(
:user
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
,
confidential:
true
)
}
let
(
:mr
)
{
create
(
:merge_request
,
source_project:
project
)
}
let!
(
:todo_mr_user
)
{
create
(
:todo
,
user:
user
,
target:
mr
,
project:
project
)
}
let!
(
:todo_issue_user
)
{
create
(
:todo
,
user:
user
,
target:
issue
,
project:
project
)
}
let!
(
:todo_group_user
)
{
create
(
:todo
,
user:
user
,
group:
group
)
}
let!
(
:todo_issue_user2
)
{
create
(
:todo
,
user:
user2
,
target:
issue
,
project:
project
)
}
let!
(
:todo_group_user2
)
{
create
(
:todo
,
user:
user2
,
group:
group
)
}
let_it_be
(
:group
,
reload:
true
)
{
create
(
:group
,
:private
)
}
let_it_be
(
:project
,
reload:
true
)
{
create
(
:project
,
group:
group
)
}
let_it_be
(
:user
,
reload:
true
)
{
create
(
:user
)
}
let_it_be
(
:user2
,
reload:
true
)
{
create
(
:user
)
}
let_it_be
(
:issue
)
{
create
(
:issue
,
project:
project
)
}
let_it_be
(
:issue_c
)
{
create
(
:issue
,
project:
project
,
confidential:
true
)
}
let_it_be
(
:todo_group_user
)
{
create
(
:todo
,
user:
user
,
group:
group
)
}
let_it_be
(
:todo_group_user2
)
{
create
(
:todo
,
user:
user2
,
group:
group
)
}
let
(
:mr
)
{
create
(
:merge_request
,
source_project:
project
)
}
let!
(
:todo_mr_user
)
{
create
(
:todo
,
user:
user
,
target:
mr
,
project:
project
)
}
let!
(
:todo_issue_user
)
{
create
(
:todo
,
user:
user
,
target:
issue
,
project:
project
)
}
let!
(
:todo_issue_c_user
)
{
create
(
:todo
,
user:
user
,
target:
issue_c
,
project:
project
)
}
let!
(
:todo_issue_c_user2
)
{
create
(
:todo
,
user:
user2
,
target:
issue_c
,
project:
project
)
}
shared_examples
'using different access permissions'
do
|
access_table
|
using
RSpec
::
Parameterized
::
TableSyntax
where
(
:group_access
,
:project_access
,
:c_todos
,
:mr_todos
,
:method
,
&
access_table
)
with_them
do
before
do
set_access
(
project
,
user
,
project_access
)
if
project_access
set_access
(
group
,
user
,
group_access
)
if
group_access
end
describe
'#execute'
do
context
'when a user leaves a project'
do
subject
{
described_class
.
new
(
user
.
id
,
project
.
id
,
'Project'
).
execute
}
it
"
#{
params
[
:method
].
to_s
.
humanize
(
capitalize:
false
)
}
"
do
send
(
method
)
end
end
end
context
'when project is private
'
do
it
'removes project todos for the provided user'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
3
)
shared_examples
'does not remove any todos
'
do
it
{
does_not_remove_any_todos
}
end
expect
(
user
.
todos
).
to
match_array
([
todo_group_user
])
expect
(
user2
.
todos
).
to
match_array
([
todo_issue_user2
,
todo_group_user2
])
end
shared_examples
'removes only confidential issues todos'
do
it
{
removes_only_confidential_issues_todos
}
end
context
'when the user is member of the project'
do
before
do
project
.
add_developer
(
user
)
end
shared_examples
'removes confidential issues and merge request todos'
do
it
{
removes_confidential_issues_and_merge_request_todos
}
end
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
end
def
does_not_remove_any_todos
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
context
'when the user is a project guest'
do
before
do
project
.
add_guest
(
user
)
end
def
removes_only_confidential_issues_todos
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
6
).
to
(
5
)
end
it
'removes only confidential issues todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
end
end
def
removes_confidential_issues_and_merge_request_todos
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
6
).
to
(
4
)
expect
(
user
.
todos
).
to
match_array
([
todo_issue_user
,
todo_group_user
])
end
context
'when the user is member of a parent group'
do
before
do
group
.
add_developer
(
user
)
end
def
set_access
(
object
,
user
,
access_name
)
case
access_name
when
:developer
object
.
add_developer
(
user
)
when
:reporter
object
.
add_reporter
(
user
)
when
:guest
object
.
add_guest
(
user
)
end
end
describe
'#execute'
do
describe
'updating a Project'
do
subject
{
described_class
.
new
(
user
.
id
,
project
.
id
,
'Project'
).
execute
}
context
'when project is private'
do
context
'when a user leaves a project'
do
it
'removes project todos for the provided user'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
6
).
to
(
3
)
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
expect
(
user
.
todos
).
to
match_array
([
todo_group_user
])
expect
(
user2
.
todos
).
to
match_array
([
todo_issue_c_user2
,
todo_group_user2
])
end
end
context
'when the user is guest of a parent group'
do
before
do
project
.
add_guest
(
user
)
end
context
'access permissions'
do
# rubocop:disable RSpec/LeakyConstantDeclaration
PROJECT_PRIVATE_ACCESS_TABLE
=
lambda
do
|
_
|
[
# :group_access, :project_access, :c_todos, :mr_todos, :method
[
nil
,
:reporter
,
:keep
,
:keep
,
:does_not_remove_any_todos
],
[
nil
,
:guest
,
:delete
,
:keep
,
:removes_only_confidential_issues_todos
],
[
:reporter
,
nil
,
:keep
,
:keep
,
:does_not_remove_any_todos
],
[
:guest
,
nil
,
:delete
,
:keep
,
:removes_only_confidential_issues_todos
]
]
end
# rubocop:enable RSpec/LeakyConstantDeclaration
it
'removes only confidential issues todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
end
it_behaves_like
'using different access permissions'
,
PROJECT_PRIVATE_ACCESS_TABLE
end
end
context
'when project is not private'
do
before
do
group
.
update!
(
visibility_level:
Gitlab
::
VisibilityLevel
::
INTERNAL
)
project
.
update!
(
visibility_level:
Gitlab
::
VisibilityLevel
::
INTERNAL
)
end
let_it_be
(
:group
,
reload:
true
)
{
create
(
:group
,
:internal
)
}
let_it_be
(
:project
,
reload:
true
)
{
create
(
:project
,
:internal
,
group:
group
)
}
let_it_be
(
:issue
,
reload:
true
)
{
create
(
:issue
,
project:
project
)
}
let_it_be
(
:issue_c
,
reload:
true
)
{
create
(
:issue
,
project:
project
,
confidential:
true
)
}
it
'enqueues the PrivateFeaturesWorker'
do
expect
(
TodosDestroyer
::
PrivateFeaturesWorker
)
...
...
@@ -84,50 +118,41 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
context
'confidential issues'
do
context
'when a user is not an author of confidential issue'
do
it
'removes only confidential issues todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
end
it_behaves_like
'removes only confidential issues todos'
end
context
'when a user is an author of confidential issue'
do
before
do
issue
.
update!
(
author:
user
)
issue
_c
.
update!
(
author:
user
)
end
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
it_behaves_like
'does not remove any todos'
end
context
'when a user is an assignee of confidential issue'
do
before
do
issue
.
assignees
<<
user
end
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
end
context
'when a user is a project guest'
do
before
do
project
.
add_guest
(
user
)
issue_c
.
assignees
<<
user
end
it
'removes only confidential issues todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
end
it_behaves_like
'does not remove any todos'
end
context
'when a user is a project guest but group developer'
do
before
do
project
.
add_guest
(
user
)
group
.
add_developer
(
user
)
end
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
context
'access permissions'
do
# rubocop:disable RSpec/LeakyConstantDeclaration
PROJECT_NOT_PRIVATE_ACCESS_TABLE
=
lambda
do
|
_
|
[
# :group_access, :project_access, :c_todos, :mr_todos, :method
[
nil
,
:reporter
,
:keep
,
:keep
,
:does_not_remove_any_todos
],
[
nil
,
:guest
,
:delete
,
:keep
,
:removes_only_confidential_issues_todos
],
[
:reporter
,
nil
,
:keep
,
:keep
,
:does_not_remove_any_todos
],
[
:guest
,
nil
,
:delete
,
:keep
,
:removes_only_confidential_issues_todos
],
[
:reporter
,
:guest
,
:keep
,
:keep
,
:does_not_remove_any_todos
]
]
end
# rubocop:enable RSpec/LeakyConstantDeclaration
it_behaves_like
'using different access permissions'
,
PROJECT_NOT_PRIVATE_ACCESS_TABLE
end
end
...
...
@@ -138,42 +163,39 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
end
it
'removes only users issue todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
6
).
to
(
5
)
end
end
end
end
end
context
'when a user leaves a g
roup'
do
describe
'updating a G
roup'
do
subject
{
described_class
.
new
(
user
.
id
,
group
.
id
,
'Group'
).
execute
}
context
'when group is private'
do
it
'removes group and subproject todos for the user'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
2
)
expect
(
user
.
todos
).
to
be_empty
expect
(
user2
.
todos
).
to
match_array
([
todo_issue_user2
,
todo_group_user2
])
end
context
'when the user is member of the group'
do
before
do
group
.
add_developer
(
user
)
end
context
'when a user leaves a group'
do
it
'removes group and subproject todos for the user'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
6
).
to
(
2
)
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
expect
(
user
.
todos
).
to
be_empty
expect
(
user2
.
todos
).
to
match_array
([
todo_issue_c_user2
,
todo_group_user2
])
end
end
context
'when the user is member of the group project but not the group'
do
before
do
project
.
add_developer
(
user
)
end
context
'access permissions'
do
# rubocop:disable RSpec/LeakyConstantDeclaration
GROUP_PRIVATE_ACCESS_TABLE
=
lambda
do
|
_
|
[
# :group_access, :project_access, :c_todos, :mr_todos, :method
[
nil
,
:reporter
,
:keep
,
:keep
,
:does_not_remove_any_todos
],
[
:reporter
,
nil
,
:keep
,
:keep
,
:does_not_remove_any_todos
]
]
end
# rubocop:enable RSpec/LeakyConstantDeclaration
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
it_behaves_like
'using different access permissions'
,
GROUP_PRIVATE_ACCESS_TABLE
end
context
'with nested groups'
do
...
...
@@ -191,12 +213,12 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
context
'when the user is not a member of any groups/projects'
do
it
'removes todos for the user including subprojects todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
1
1
).
to
(
4
)
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
1
2
).
to
(
4
)
expect
(
user
.
todos
).
to
be_empty
expect
(
user2
.
todos
)
.
to
match_array
(
[
todo_issue_user2
,
todo_group_user2
,
todo_subproject_user2
,
todo_subpgroup_user2
]
[
todo_issue_
c_
user2
,
todo_group_user2
,
todo_subproject_user2
,
todo_subpgroup_user2
]
)
end
end
...
...
@@ -208,9 +230,7 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
parent_group
.
add_developer
(
user
)
end
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
it_behaves_like
'does not remove any todos'
end
context
'when the user is member of a subgroup'
do
...
...
@@ -219,12 +239,12 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
end
it
'does not remove group and subproject todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
1
1
).
to
(
7
)
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
1
2
).
to
(
7
)
expect
(
user
.
todos
).
to
match_array
([
todo_group_user
,
todo_subgroup_user
,
todo_subproject_user
])
expect
(
user2
.
todos
)
.
to
match_array
(
[
todo_issue_user2
,
todo_group_user2
,
todo_subproject_user2
,
todo_subpgroup_user2
]
[
todo_issue_
c_
user2
,
todo_group_user2
,
todo_subproject_user2
,
todo_subpgroup_user2
]
)
end
end
...
...
@@ -235,12 +255,12 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
end
it
'does not remove subproject and group todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
1
1
).
to
(
7
)
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
1
2
).
to
(
7
)
expect
(
user
.
todos
).
to
match_array
([
todo_subgroup_user
,
todo_group_user
,
todo_subproject_user
])
expect
(
user2
.
todos
)
.
to
match_array
(
[
todo_issue_user2
,
todo_group_user2
,
todo_subproject_user2
,
todo_subpgroup_user2
]
[
todo_issue_
c_
user2
,
todo_group_user2
,
todo_subproject_user2
,
todo_subpgroup_user2
]
)
end
end
...
...
@@ -248,10 +268,10 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
end
context
'when group is not private'
do
before
do
group
.
update!
(
visibility_level:
Gitlab
::
VisibilityLevel
::
INTERNAL
)
project
.
update!
(
visibility_level:
Gitlab
::
VisibilityLevel
::
INTERNAL
)
end
let_it_be
(
:group
,
reload:
true
)
{
create
(
:group
,
:internal
)
}
let_it_be
(
:project
,
reload:
true
)
{
create
(
:project
,
:internal
,
group:
group
)
}
let_it_be
(
:issue
,
reload:
true
)
{
create
(
:issue
,
project:
project
)
}
let_it_be
(
:issue_c
,
reload:
true
)
{
create
(
:issue
,
project:
project
,
confidential:
true
)
}
it
'enqueues the PrivateFeaturesWorker'
do
expect
(
TodosDestroyer
::
PrivateFeaturesWorker
)
...
...
@@ -260,31 +280,20 @@ RSpec.describe Todos::Destroy::EntityLeaveService do
subject
end
context
'when user is not member'
do
it
'removes only confidential issues todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
end
end
context
'when user is a project guest'
do
before
do
project
.
add_guest
(
user
)
end
it
'removes only confidential issues todos'
do
expect
{
subject
}.
to
change
{
Todo
.
count
}.
from
(
5
).
to
(
4
)
end
end
context
'when user is a project guest & group developer'
do
before
do
project
.
add_guest
(
user
)
group
.
add_developer
(
user
)
end
context
'access permissions'
do
# rubocop:disable RSpec/LeakyConstantDeclaration
GROUP_NOT_PRIVATE_ACCESS_TABLE
=
lambda
do
|
_
|
[
# :group_access, :project_access, :c_todos, :mr_todos, :method
[
nil
,
nil
,
:delete
,
:keep
,
:removes_only_confidential_issues_todos
],
[
nil
,
:guest
,
:delete
,
:keep
,
:removes_only_confidential_issues_todos
],
[
:reporter
,
:guest
,
:keep
,
:keep
,
:does_not_remove_any_todos
]
]
end
# rubocop:enable RSpec/LeakyConstantDeclaration
it
'does not remove any todos'
do
expect
{
subject
}.
not_to
change
{
Todo
.
count
}
end
it_behaves_like
'using different access permissions'
,
GROUP_NOT_PRIVATE_ACCESS_TABLE
end
end
end
...
...
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