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
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
gitlab-ce
Commits
dccf8a9f
Commit
dccf8a9f
authored
Apr 25, 2016
by
Zeger-Jan van de Weg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add tests on Awardables and Award Emoji
parent
4eb16290
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
181 additions
and
56 deletions
+181
-56
app/assets/javascripts/awards_handler.coffee
app/assets/javascripts/awards_handler.coffee
+10
-10
app/assets/javascripts/notes.js.coffee
app/assets/javascripts/notes.js.coffee
+1
-1
app/controllers/projects/notes_controller.rb
app/controllers/projects/notes_controller.rb
+1
-2
app/helpers/issues_helper.rb
app/helpers/issues_helper.rb
+4
-7
app/models/merge_request.rb
app/models/merge_request.rb
+0
-1
db/schema.rb
db/schema.rb
+17
-2
features/steps/project/issues/issues.rb
features/steps/project/issues/issues.rb
+5
-5
features/steps/project/merge_requests.rb
features/steps/project/merge_requests.rb
+5
-5
spec/controllers/projects/issues_controller_spec.rb
spec/controllers/projects/issues_controller_spec.rb
+14
-0
spec/factories/award_emoji.rb
spec/factories/award_emoji.rb
+11
-0
spec/features/issues_spec.rb
spec/features/issues_spec.rb
+1
-1
spec/features/notes_on_merge_requests_spec.rb
spec/features/notes_on_merge_requests_spec.rb
+2
-2
spec/models/concerns/awardable_spec.rb
spec/models/concerns/awardable_spec.rb
+49
-0
spec/models/concerns/issuable_spec.rb
spec/models/concerns/issuable_spec.rb
+4
-0
spec/models/user_spec.rb
spec/models/user_spec.rb
+1
-0
spec/services/notes/create_service_spec.rb
spec/services/notes/create_service_spec.rb
+8
-12
spec/services/todo_service_spec.rb
spec/services/todo_service_spec.rb
+9
-8
spec/services/toggle_award_emoji_service_spec.rb
spec/services/toggle_award_emoji_service_spec.rb
+39
-0
No files found.
app/assets/javascripts/awards_handler.coffee
View file @
dccf8a9f
...
@@ -4,21 +4,21 @@ class @AwardsHandler
...
@@ -4,21 +4,21 @@ class @AwardsHandler
$
(
document
)
$
(
document
)
.
off
"click"
,
".js-add-award"
.
off
"click"
,
".js-add-award"
.
on
"click"
,
".js-add-award"
,
(
e
vent
)
=>
.
on
"click"
,
".js-add-award"
,
(
e
)
=>
e
vent
.
stopPropagation
()
e
.
stopPropagation
()
e
vent
.
preventDefault
()
e
.
preventDefault
()
@
showEmojiMenu
$
(
e
vent
.
currentTarget
)
@
showEmojiMenu
$
(
e
.
currentTarget
)
$
(
"html"
).
on
'click'
,
(
e
vent
)
->
$
(
"html"
).
on
'click'
,
(
e
)
->
if
!
$
(
e
vent
.
target
).
closest
(
".emoji-menu"
).
length
if
!
$
(
e
.
target
).
closest
(
".emoji-menu"
).
length
if
$
(
".emoji-menu"
).
is
(
":visible"
)
if
$
(
".emoji-menu"
).
is
(
":visible"
)
$
(
'.js-add-award.is-active'
).
removeClass
'is-active'
$
(
'.js-add-award.is-active'
).
removeClass
'is-active'
$
(
".emoji-menu"
).
removeClass
"is-visible"
$
(
".emoji-menu"
).
removeClass
"is-visible"
$
(
document
)
$
(
document
)
.
off
"click"
,
".js-emoji-btn"
.
off
"click"
,
".js-emoji-btn"
.
on
"click"
,
".js-emoji-btn"
,
(
e
)
=>
@
handleClick
(
e
)
.
on
"click"
,
".js-emoji-btn"
,
@
handleClick
.
bind
(
@
)
handleClick
:
(
e
)
->
handleClick
:
(
e
)
->
e
.
preventDefault
()
e
.
preventDefault
()
...
@@ -31,7 +31,8 @@ class @AwardsHandler
...
@@ -31,7 +31,8 @@ class @AwardsHandler
else
if
$votesBlock
.
length
is
0
else
if
$votesBlock
.
length
is
0
$votesBlock
=
$addAwardBtn
.
closest
(
'.js-awards-block'
)
$votesBlock
=
$addAwardBtn
.
closest
(
'.js-awards-block'
)
$votesBlock
.
addClass
'js-awards-block-current'
@
currentVoteBlock
=
$votesBlock
awardUrl
=
$votesBlock
.
data
'award-url'
awardUrl
=
$votesBlock
.
data
'award-url'
emoji
=
$emojiBtn
emoji
=
$emojiBtn
.
find
(
".icon"
)
.
find
(
".icon"
)
...
@@ -103,7 +104,6 @@ class @AwardsHandler
...
@@ -103,7 +104,6 @@ class @AwardsHandler
emoji
=
@
normilizeEmojiName
(
emoji
)
emoji
=
@
normilizeEmojiName
(
emoji
)
@
postEmoji
awardUrl
,
emoji
,
=>
@
postEmoji
awardUrl
,
emoji
,
=>
@
addAwardToEmojiBar
(
emoji
)
@
addAwardToEmojiBar
(
emoji
)
$
(
'.js-awards-block'
).
removeClass
'js-awards-block-current'
$
(
".emoji-menu"
).
removeClass
"is-visible"
$
(
".emoji-menu"
).
removeClass
"is-visible"
...
@@ -210,7 +210,7 @@ class @AwardsHandler
...
@@ -210,7 +210,7 @@ class @AwardsHandler
callback
.
call
()
callback
.
call
()
findEmojiIcon
:
(
emoji
)
->
findEmojiIcon
:
(
emoji
)
->
$
(
".js-awards-block-current.awards >
.js-emoji-btn [data-emoji='
#{
emoji
}
']"
)
@
currentVoteBlock
.
find
(
"
.js-emoji-btn [data-emoji='
#{
emoji
}
']"
)
scrollToAwards
:
->
scrollToAwards
:
->
$
(
'body, html'
).
animate
({
$
(
'body, html'
).
animate
({
...
...
app/assets/javascripts/notes.js.coffee
View file @
dccf8a9f
...
@@ -150,7 +150,7 @@ class @Notes
...
@@ -150,7 +150,7 @@ class @Notes
renderNote
:
(
note
)
->
renderNote
:
(
note
)
->
unless
note
.
valid
unless
note
.
valid
if
note
.
award
if
note
.
award
flash
=
new
Flash
(
'You have already awarded this emoji,
and it we
\'
ve removed it
'
,
'alert'
)
flash
=
new
Flash
(
'You have already awarded this emoji,
it has been removed
'
,
'alert'
)
flash
.
pinTo
(
'.header-content'
)
flash
.
pinTo
(
'.header-content'
)
return
return
...
...
app/controllers/projects/notes_controller.rb
View file @
dccf8a9f
...
@@ -22,7 +22,7 @@ class Projects::NotesController < Projects::ApplicationController
...
@@ -22,7 +22,7 @@ class Projects::NotesController < Projects::ApplicationController
def
create
def
create
@note
=
Notes
::
CreateService
.
new
(
project
,
current_user
,
note_params
).
execute
@note
=
Notes
::
CreateService
.
new
(
project
,
current_user
,
note_params
).
execute
@note
=
note
.
is_a?
(
AwardEmoji
)
?
@note
.
to_note_json
:
note_json
(
@note
)
@note
=
@
note
.
is_a?
(
AwardEmoji
)
?
@note
.
to_note_json
:
note_json
(
@note
)
respond_to
do
|
format
|
respond_to
do
|
format
|
format
.
json
{
render
json:
@note
}
format
.
json
{
render
json:
@note
}
...
@@ -63,7 +63,6 @@ class Projects::NotesController < Projects::ApplicationController
...
@@ -63,7 +63,6 @@ class Projects::NotesController < Projects::ApplicationController
def
note
def
note
@note
||=
@project
.
notes
.
find
(
params
[
:id
])
@note
||=
@project
.
notes
.
find
(
params
[
:id
])
end
end
alias_method
:awardable
,
:note
def
note_to_html
(
note
)
def
note_to_html
(
note
)
render_to_string
(
render_to_string
(
...
...
app/helpers/issues_helper.rb
View file @
dccf8a9f
...
@@ -131,7 +131,7 @@ module IssuesHelper
...
@@ -131,7 +131,7 @@ module IssuesHelper
class:
"icon emoji-icon emoji-
#{
unicode
}
"
,
class:
"icon emoji-icon emoji-
#{
unicode
}
"
,
title:
name
,
title:
name
,
data:
data
data:
data
else
else
# Emoji icons displayed separately, used for the awards already given
# Emoji icons displayed separately, used for the awards already given
# to an issue or merge request.
# to an issue or merge request.
content_tag
:img
,
""
,
content_tag
:img
,
""
,
...
@@ -145,12 +145,9 @@ module IssuesHelper
...
@@ -145,12 +145,9 @@ module IssuesHelper
end
end
def
award_user_list
(
awards
,
current_user
)
def
award_user_list
(
awards
,
current_user
)
list
=
awards
.
map
do
|
award
|
awards
.
map
do
|
award
|
award
.
user
==
current_user
?
'me'
:
award
.
user
.
name
award
.
user
==
current_user
?
"me"
:
award
.
user
.
name
end
.
join
(
', '
)
end
list
.
join
(
", "
)
end
end
def
award_active_class
(
awards
,
current_user
)
def
award_active_class
(
awards
,
current_user
)
...
...
app/models/merge_request.rb
View file @
dccf8a9f
...
@@ -36,7 +36,6 @@ class MergeRequest < ActiveRecord::Base
...
@@ -36,7 +36,6 @@ class MergeRequest < ActiveRecord::Base
include
Referable
include
Referable
include
Sortable
include
Sortable
include
Taskable
include
Taskable
include
Awardable
belongs_to
:target_project
,
foreign_key: :target_project_id
,
class_name:
"Project"
belongs_to
:target_project
,
foreign_key: :target_project_id
,
class_name:
"Project"
belongs_to
:source_project
,
foreign_key: :source_project_id
,
class_name:
"Project"
belongs_to
:source_project
,
foreign_key: :source_project_id
,
class_name:
"Project"
...
...
db/schema.rb
View file @
dccf8a9f
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
#
#
# It's strongly recommended that you check this file into your version control system.
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
201604
16190505
)
do
ActiveRecord
::
Schema
.
define
(
version:
201604
21130527
)
do
# These are extensions that must be enabled in order to support this database
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
enable_extension
"plpgsql"
...
@@ -77,7 +77,9 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -77,7 +77,9 @@ ActiveRecord::Schema.define(version: 20160416190505) do
t
.
string
"akismet_api_key"
t
.
string
"akismet_api_key"
t
.
boolean
"email_author_in_body"
,
default:
false
t
.
boolean
"email_author_in_body"
,
default:
false
t
.
integer
"default_group_visibility"
t
.
integer
"default_group_visibility"
t
.
boolean
"repository_checks_enabled"
,
default:
true
t
.
boolean
"repository_checks_enabled"
,
default:
false
t
.
integer
"metrics_packet_size"
,
default:
1
t
.
text
"shared_runners_text"
end
end
create_table
"audit_events"
,
force: :cascade
do
|
t
|
create_table
"audit_events"
,
force: :cascade
do
|
t
|
...
@@ -182,14 +184,21 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -182,14 +184,21 @@ ActiveRecord::Schema.define(version: 20160416190505) do
t
.
text
"yaml_errors"
t
.
text
"yaml_errors"
t
.
datetime
"committed_at"
t
.
datetime
"committed_at"
t
.
integer
"gl_project_id"
t
.
integer
"gl_project_id"
t
.
string
"status"
t
.
datetime
"started_at"
t
.
datetime
"finished_at"
t
.
integer
"duration"
end
end
add_index
"ci_commits"
,
[
"gl_project_id"
,
"sha"
],
name:
"index_ci_commits_on_gl_project_id_and_sha"
,
using: :btree
add_index
"ci_commits"
,
[
"gl_project_id"
,
"status"
],
name:
"index_ci_commits_on_gl_project_id_and_status"
,
using: :btree
add_index
"ci_commits"
,
[
"gl_project_id"
],
name:
"index_ci_commits_on_gl_project_id"
,
using: :btree
add_index
"ci_commits"
,
[
"gl_project_id"
],
name:
"index_ci_commits_on_gl_project_id"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
,
"committed_at"
,
"id"
],
name:
"index_ci_commits_on_project_id_and_committed_at_and_id"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
,
"committed_at"
,
"id"
],
name:
"index_ci_commits_on_project_id_and_committed_at_and_id"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
,
"committed_at"
],
name:
"index_ci_commits_on_project_id_and_committed_at"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
,
"committed_at"
],
name:
"index_ci_commits_on_project_id_and_committed_at"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
,
"sha"
],
name:
"index_ci_commits_on_project_id_and_sha"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
,
"sha"
],
name:
"index_ci_commits_on_project_id_and_sha"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
],
name:
"index_ci_commits_on_project_id"
,
using: :btree
add_index
"ci_commits"
,
[
"project_id"
],
name:
"index_ci_commits_on_project_id"
,
using: :btree
add_index
"ci_commits"
,
[
"sha"
],
name:
"index_ci_commits_on_sha"
,
using: :btree
add_index
"ci_commits"
,
[
"sha"
],
name:
"index_ci_commits_on_sha"
,
using: :btree
add_index
"ci_commits"
,
[
"status"
],
name:
"index_ci_commits_on_status"
,
using: :btree
create_table
"ci_events"
,
force: :cascade
do
|
t
|
create_table
"ci_events"
,
force: :cascade
do
|
t
|
t
.
integer
"project_id"
t
.
integer
"project_id"
...
@@ -433,6 +442,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -433,6 +442,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
t
.
integer
"moved_to_id"
t
.
integer
"moved_to_id"
t
.
boolean
"confidential"
,
default:
false
t
.
boolean
"confidential"
,
default:
false
t
.
datetime
"deleted_at"
t
.
datetime
"deleted_at"
t
.
date
"due_date"
end
end
add_index
"issues"
,
[
"assignee_id"
],
name:
"index_issues_on_assignee_id"
,
using: :btree
add_index
"issues"
,
[
"assignee_id"
],
name:
"index_issues_on_assignee_id"
,
using: :btree
...
@@ -442,6 +452,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -442,6 +452,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
add_index
"issues"
,
[
"created_at"
],
name:
"index_issues_on_created_at"
,
using: :btree
add_index
"issues"
,
[
"created_at"
],
name:
"index_issues_on_created_at"
,
using: :btree
add_index
"issues"
,
[
"deleted_at"
],
name:
"index_issues_on_deleted_at"
,
using: :btree
add_index
"issues"
,
[
"deleted_at"
],
name:
"index_issues_on_deleted_at"
,
using: :btree
add_index
"issues"
,
[
"description"
],
name:
"index_issues_on_description_trigram"
,
using: :gin
,
opclasses:
{
"description"
=>
"gin_trgm_ops"
}
add_index
"issues"
,
[
"description"
],
name:
"index_issues_on_description_trigram"
,
using: :gin
,
opclasses:
{
"description"
=>
"gin_trgm_ops"
}
add_index
"issues"
,
[
"due_date"
],
name:
"index_issues_on_due_date"
,
using: :btree
add_index
"issues"
,
[
"milestone_id"
],
name:
"index_issues_on_milestone_id"
,
using: :btree
add_index
"issues"
,
[
"milestone_id"
],
name:
"index_issues_on_milestone_id"
,
using: :btree
add_index
"issues"
,
[
"project_id"
,
"iid"
],
name:
"index_issues_on_project_id_and_iid"
,
unique:
true
,
using: :btree
add_index
"issues"
,
[
"project_id"
,
"iid"
],
name:
"index_issues_on_project_id_and_iid"
,
unique:
true
,
using: :btree
add_index
"issues"
,
[
"project_id"
],
name:
"index_issues_on_project_id"
,
using: :btree
add_index
"issues"
,
[
"project_id"
],
name:
"index_issues_on_project_id"
,
using: :btree
...
@@ -635,12 +646,14 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -635,12 +646,14 @@ ActiveRecord::Schema.define(version: 20160416190505) do
t
.
boolean
"system"
,
default:
false
,
null:
false
t
.
boolean
"system"
,
default:
false
,
null:
false
t
.
text
"st_diff"
t
.
text
"st_diff"
t
.
integer
"updated_by_id"
t
.
integer
"updated_by_id"
t
.
boolean
"is_award"
,
default:
false
,
null:
false
end
end
add_index
"notes"
,
[
"author_id"
],
name:
"index_notes_on_author_id"
,
using: :btree
add_index
"notes"
,
[
"author_id"
],
name:
"index_notes_on_author_id"
,
using: :btree
add_index
"notes"
,
[
"commit_id"
],
name:
"index_notes_on_commit_id"
,
using: :btree
add_index
"notes"
,
[
"commit_id"
],
name:
"index_notes_on_commit_id"
,
using: :btree
add_index
"notes"
,
[
"created_at"
,
"id"
],
name:
"index_notes_on_created_at_and_id"
,
using: :btree
add_index
"notes"
,
[
"created_at"
,
"id"
],
name:
"index_notes_on_created_at_and_id"
,
using: :btree
add_index
"notes"
,
[
"created_at"
],
name:
"index_notes_on_created_at"
,
using: :btree
add_index
"notes"
,
[
"created_at"
],
name:
"index_notes_on_created_at"
,
using: :btree
add_index
"notes"
,
[
"is_award"
],
name:
"index_notes_on_is_award"
,
using: :btree
add_index
"notes"
,
[
"line_code"
],
name:
"index_notes_on_line_code"
,
using: :btree
add_index
"notes"
,
[
"line_code"
],
name:
"index_notes_on_line_code"
,
using: :btree
add_index
"notes"
,
[
"note"
],
name:
"index_notes_on_note_trigram"
,
using: :gin
,
opclasses:
{
"note"
=>
"gin_trgm_ops"
}
add_index
"notes"
,
[
"note"
],
name:
"index_notes_on_note_trigram"
,
using: :gin
,
opclasses:
{
"note"
=>
"gin_trgm_ops"
}
add_index
"notes"
,
[
"noteable_id"
,
"noteable_type"
],
name:
"index_notes_on_noteable_id_and_noteable_type"
,
using: :btree
add_index
"notes"
,
[
"noteable_id"
,
"noteable_type"
],
name:
"index_notes_on_noteable_id_and_noteable_type"
,
using: :btree
...
@@ -829,6 +842,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -829,6 +842,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
t
.
boolean
"build_events"
,
default:
false
,
null:
false
t
.
boolean
"build_events"
,
default:
false
,
null:
false
t
.
string
"category"
,
default:
"common"
,
null:
false
t
.
string
"category"
,
default:
"common"
,
null:
false
t
.
boolean
"default"
,
default:
false
t
.
boolean
"default"
,
default:
false
t
.
boolean
"wiki_page_events"
,
default:
true
end
end
add_index
"services"
,
[
"category"
],
name:
"index_services_on_category"
,
using: :btree
add_index
"services"
,
[
"category"
],
name:
"index_services_on_category"
,
using: :btree
...
@@ -1023,6 +1037,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
...
@@ -1023,6 +1037,7 @@ ActiveRecord::Schema.define(version: 20160416190505) do
t
.
boolean
"note_events"
,
default:
false
,
null:
false
t
.
boolean
"note_events"
,
default:
false
,
null:
false
t
.
boolean
"enable_ssl_verification"
,
default:
true
t
.
boolean
"enable_ssl_verification"
,
default:
true
t
.
boolean
"build_events"
,
default:
false
,
null:
false
t
.
boolean
"build_events"
,
default:
false
,
null:
false
t
.
boolean
"wiki_page_events"
,
default:
false
,
null:
false
end
end
add_index
"web_hooks"
,
[
"created_at"
,
"id"
],
name:
"index_web_hooks_on_created_at_and_id"
,
using: :btree
add_index
"web_hooks"
,
[
"created_at"
,
"id"
],
name:
"index_web_hooks_on_created_at_and_id"
,
using: :btree
...
...
features/steps/project/issues/issues.rb
View file @
dccf8a9f
...
@@ -191,15 +191,15 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
...
@@ -191,15 +191,15 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
end
end
step
'issue "Release 0.4" have 2 upvotes and 1 downvote'
do
step
'issue "Release 0.4" have 2 upvotes and 1 downvote'
do
issu
e
=
Issue
.
find_by
(
title:
'Release 0.4'
)
awardabl
e
=
Issue
.
find_by
(
title:
'Release 0.4'
)
create_list
(
:upvote
_note
,
2
,
project:
project
,
noteable:
issu
e
)
create_list
(
:upvote
,
2
,
project:
project
,
awardable:
awardabl
e
)
create
(
:downvote
_note
,
project:
project
,
noteable:
issu
e
)
create
(
:downvote
,
project:
project
,
awardable:
awardabl
e
)
end
end
step
'issue "Tweet control" have 1 upvote and 2 downvotes'
do
step
'issue "Tweet control" have 1 upvote and 2 downvotes'
do
issue
=
Issue
.
find_by
(
title:
'Tweet control'
)
issue
=
Issue
.
find_by
(
title:
'Tweet control'
)
create
(
:upvote
_note
,
project:
project
,
noteable:
issue
)
create
(
:upvote
,
project:
project
,
noteable:
issue
)
create_list
(
:downvote
_note
,
2
,
project:
project
,
noteable:
issue
)
create_list
(
:downvote
,
2
,
project:
project
,
noteable:
issue
)
end
end
step
'The list should be sorted by "Least popular"'
do
step
'The list should be sorted by "Least popular"'
do
...
...
features/steps/project/merge_requests.rb
View file @
dccf8a9f
...
@@ -179,14 +179,14 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
...
@@ -179,14 +179,14 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
step
'merge request "Bug NS-04" have 2 upvotes and 1 downvote'
do
step
'merge request "Bug NS-04" have 2 upvotes and 1 downvote'
do
merge_request
=
MergeRequest
.
find_by
(
title:
'Bug NS-04'
)
merge_request
=
MergeRequest
.
find_by
(
title:
'Bug NS-04'
)
create_list
(
:upvote
_note
,
2
,
project:
project
,
note
able:
merge_request
)
create_list
(
:upvote
,
2
,
project:
project
,
award
able:
merge_request
)
create
(
:downvote
_note
,
project:
project
,
note
able:
merge_request
)
create
(
:downvote
,
project:
project
,
award
able:
merge_request
)
end
end
step
'merge request "Bug NS-06" have 1 upvote and 2 downvotes'
do
step
'merge request "Bug NS-06" have 1 upvote and 2 downvotes'
do
merge_request
=
MergeRequest
.
find_by
(
title:
'Bug NS-06'
)
awardable
=
MergeRequest
.
find_by
(
title:
'Bug NS-06'
)
create
(
:upvote
_note
,
project:
project
,
noteable:
merge_request
)
create
(
:upvote
,
project:
project
,
awardable:
awardable
)
create_list
(
:downvote
_note
,
2
,
project:
project
,
noteable:
merge_request
)
create_list
(
:downvote
,
2
,
project:
project
,
awardable:
awardable
)
end
end
step
'The list should be sorted by "Least popular"'
do
step
'The list should be sorted by "Least popular"'
do
...
...
spec/controllers/projects/issues_controller_spec.rb
View file @
dccf8a9f
...
@@ -211,4 +211,18 @@ describe Projects::IssuesController do
...
@@ -211,4 +211,18 @@ describe Projects::IssuesController do
end
end
end
end
end
end
describe
'POST #toggle_award_emoji'
do
before
do
sign_in
(
user
)
project
.
team
<<
[
user
,
:developer
]
end
it
"yields status code 200"
do
post
(
:toggle_award_emoji
,
namespace_id:
project
.
namespace
.
path
,
project_id:
project
.
path
,
id:
issue
.
iid
,
name:
"thumbsup"
)
expect
(
response
.
status
).
to
eq
(
200
)
end
end
end
end
spec/factories/award_emoji.rb
View file @
dccf8a9f
...
@@ -3,5 +3,16 @@ FactoryGirl.define do
...
@@ -3,5 +3,16 @@ FactoryGirl.define do
name
"thumbsup"
name
"thumbsup"
user
user
awardable
factory: :issue
awardable
factory: :issue
trait
:thumbs_up
trait
:upvote
trait
:thumbs_down
do
name
"thumbsdown"
end
trait
:downvote
do
name
"thumbsdown"
end
end
end
end
end
spec/features/issues_spec.rb
View file @
dccf8a9f
...
@@ -67,7 +67,7 @@ describe 'Issues', feature: true do
...
@@ -67,7 +67,7 @@ describe 'Issues', feature: true do
describe
'Issue info'
do
describe
'Issue info'
do
it
'excludes award_emoji from comment count'
do
it
'excludes award_emoji from comment count'
do
issue
=
create
(
:issue
,
author:
@user
,
assignee:
@user
,
project:
project
,
title:
'foobar'
)
issue
=
create
(
:issue
,
author:
@user
,
assignee:
@user
,
project:
project
,
title:
'foobar'
)
create
(
:
upvote_note
,
note
able:
issue
)
create
(
:
award_emoji
,
award
able:
issue
)
visit
namespace_project_issues_path
(
project
.
namespace
,
project
,
assignee_id:
@user
.
id
)
visit
namespace_project_issues_path
(
project
.
namespace
,
project
,
assignee_id:
@user
.
id
)
...
...
spec/features/notes_on_merge_requests_spec.rb
View file @
dccf8a9f
...
@@ -8,7 +8,7 @@ describe 'Comments', feature: true do
...
@@ -8,7 +8,7 @@ describe 'Comments', feature: true do
it
'excludes award_emoji from comment count'
do
it
'excludes award_emoji from comment count'
do
merge_request
=
create
(
:merge_request
)
merge_request
=
create
(
:merge_request
)
project
=
merge_request
.
source_project
project
=
merge_request
.
source_project
create
(
:
upvote_note
,
note
able:
merge_request
,
project:
project
)
create
(
:
award_emoji
,
award
able:
merge_request
,
project:
project
)
login_as
:admin
login_as
:admin
visit
namespace_project_merge_requests_path
(
project
.
namespace
,
project
)
visit
namespace_project_merge_requests_path
(
project
.
namespace
,
project
)
...
@@ -146,7 +146,7 @@ describe 'Comments', feature: true do
...
@@ -146,7 +146,7 @@ describe 'Comments', feature: true do
describe
'comment info'
do
describe
'comment info'
do
it
'excludes award_emoji from comment count'
do
it
'excludes award_emoji from comment count'
do
create
(
:
upvote_note
,
note
able:
merge_request
,
project:
project
)
create
(
:
award_emoji
,
award
able:
merge_request
,
project:
project
)
visit
namespace_project_merge_request_path
(
project
.
namespace
,
project
,
merge_request
)
visit
namespace_project_merge_request_path
(
project
.
namespace
,
project
,
merge_request
)
...
...
spec/models/concerns/awardable_spec.rb
0 → 100644
View file @
dccf8a9f
require
'spec_helper'
describe
Issue
,
"Awardable"
do
let!
(
:issue
)
{
create
(
:issue
)
}
let!
(
:award_emoji
)
{
create
(
:award_emoji
,
:downvote
,
awardable:
issue
)
}
describe
"Associations"
do
it
{
is_expected
.
to
have_many
(
:award_emoji
).
dependent
(
:destroy
)
}
end
describe
"ClassMethods"
do
let!
(
:issue2
)
{
create
(
:issue
)
}
before
do
create
(
:award_emoji
,
awardable:
issue2
)
end
it
"orders on upvotes"
do
expect
(
Issue
.
order_upvotes_desc
.
to_a
).
to
eq
[
issue2
,
issue
]
end
it
"orders on downvotes"
do
expect
(
Issue
.
order_downvotes_desc
.
to_a
).
to
eq
[
issue
,
issue2
]
end
end
describe
"#upvotes"
do
it
"counts the number of upvotes"
do
expect
(
issue
.
upvotes
).
to
be
0
end
end
describe
"#downvotes"
do
it
"counts the number of downvotes"
do
expect
(
issue
.
downvotes
).
to
be
1
end
end
describe
"#toggle_award_emoji"
do
it
"adds an emoji if it isn't awarded yet"
do
expect
{
issue
.
toggle_award_emoji
(
"thumbsup"
,
award_emoji
.
user
)
}.
to
change
{
AwardEmoji
.
count
}.
by
1
end
it
"toggles already awarded emoji"
do
expect
{
issue
.
toggle_award_emoji
(
"thumbsdown"
,
award_emoji
.
user
)
}.
to
change
{
AwardEmoji
.
count
}.
by
-
1
end
end
end
spec/models/concerns/issuable_spec.rb
View file @
dccf8a9f
...
@@ -12,6 +12,10 @@ describe Issue, "Issuable" do
...
@@ -12,6 +12,10 @@ describe Issue, "Issuable" do
it
{
is_expected
.
to
have_many
(
:todos
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:todos
).
dependent
(
:destroy
)
}
end
end
describe
'Included modules'
do
it
{
is_expected
.
to
include_module
(
Awardable
)
}
end
describe
"Validation"
do
describe
"Validation"
do
before
do
before
do
allow
(
subject
).
to
receive
(
:set_iid
).
and_return
(
false
)
allow
(
subject
).
to
receive
(
:set_iid
).
and_return
(
false
)
...
...
spec/models/user_spec.rb
View file @
dccf8a9f
...
@@ -93,6 +93,7 @@ describe User, models: true do
...
@@ -93,6 +93,7 @@ describe User, models: true do
it
{
is_expected
.
to
have_one
(
:abuse_report
)
}
it
{
is_expected
.
to
have_one
(
:abuse_report
)
}
it
{
is_expected
.
to
have_many
(
:spam_logs
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:spam_logs
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:todos
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:todos
).
dependent
(
:destroy
)
}
it
{
is_expected
.
to
have_many
(
:award_emoji
).
dependent
(
:destroy
)
}
end
end
describe
'validations'
do
describe
'validations'
do
...
...
spec/services/notes/create_service_spec.rb
View file @
dccf8a9f
...
@@ -14,7 +14,7 @@ describe Notes::CreateService, services: true do
...
@@ -14,7 +14,7 @@ describe Notes::CreateService, services: true do
noteable_type:
'Issue'
,
noteable_type:
'Issue'
,
noteable_id:
issue
.
id
noteable_id:
issue
.
id
}
}
@note
=
Notes
::
CreateService
.
new
(
project
,
user
,
opts
).
execute
@note
=
Notes
::
CreateService
.
new
(
project
,
user
,
opts
).
execute
end
end
...
@@ -28,18 +28,16 @@ describe Notes::CreateService, services: true do
...
@@ -28,18 +28,16 @@ describe Notes::CreateService, services: true do
project
.
team
<<
[
user
,
:master
]
project
.
team
<<
[
user
,
:master
]
end
end
it
"creates
emoji note
"
do
it
"creates
an award emoji
"
do
opts
=
{
opts
=
{
note:
':smile: '
,
note:
':smile: '
,
noteable_type:
'Issue'
,
noteable_type:
'Issue'
,
noteable_id:
issue
.
id
noteable_id:
issue
.
id
}
}
note
=
Notes
::
CreateService
.
new
(
project
,
user
,
opts
).
execute
@note
=
Notes
::
CreateService
.
new
(
project
,
user
,
opts
).
execute
expect
(
note
).
to
be_valid
expect
(
note
.
name
).
to
eq
(
'smile'
)
expect
(
@note
).
to
be_valid
expect
(
@note
.
note
).
to
eq
(
'smile'
)
expect
(
@note
.
is_award
).
to
be_truthy
end
end
it
"creates regular note if emoji name is invalid"
do
it
"creates regular note if emoji name is invalid"
do
...
@@ -48,12 +46,10 @@ describe Notes::CreateService, services: true do
...
@@ -48,12 +46,10 @@ describe Notes::CreateService, services: true do
noteable_type:
'Issue'
,
noteable_type:
'Issue'
,
noteable_id:
issue
.
id
noteable_id:
issue
.
id
}
}
note
=
Notes
::
CreateService
.
new
(
project
,
user
,
opts
).
execute
@note
=
Notes
::
CreateService
.
new
(
project
,
user
,
opts
).
execute
expect
(
note
).
to
be_valid
expect
(
note
.
note
).
to
eq
(
opts
[
:note
])
expect
(
@note
).
to
be_valid
expect
(
@note
.
note
).
to
eq
(
opts
[
:note
])
expect
(
@note
.
is_award
).
to
be_falsy
end
end
end
end
end
end
spec/services/todo_service_spec.rb
View file @
dccf8a9f
...
@@ -137,7 +137,6 @@ describe TodoService, services: true do
...
@@ -137,7 +137,6 @@ describe TodoService, services: true do
let
(
:note_on_commit
)
{
create
(
:note_on_commit
,
project:
project
,
author:
john_doe
,
note:
mentions
)
}
let
(
:note_on_commit
)
{
create
(
:note_on_commit
,
project:
project
,
author:
john_doe
,
note:
mentions
)
}
let
(
:note_on_confidential_issue
)
{
create
(
:note_on_issue
,
noteable:
confidential_issue
,
project:
project
,
note:
mentions
)
}
let
(
:note_on_confidential_issue
)
{
create
(
:note_on_issue
,
noteable:
confidential_issue
,
project:
project
,
note:
mentions
)
}
let
(
:note_on_project_snippet
)
{
create
(
:note_on_project_snippet
,
project:
project
,
author:
john_doe
,
note:
mentions
)
}
let
(
:note_on_project_snippet
)
{
create
(
:note_on_project_snippet
,
project:
project
,
author:
john_doe
,
note:
mentions
)
}
let
(
:award_note
)
{
create
(
:note
,
:award
,
project:
project
,
noteable:
issue
,
author:
john_doe
,
note:
'thumbsup'
)
}
let
(
:system_note
)
{
create
(
:system_note
,
project:
project
,
noteable:
issue
)
}
let
(
:system_note
)
{
create
(
:system_note
,
project:
project
,
noteable:
issue
)
}
it
'mark related pending todos to the noteable for the note author as done'
do
it
'mark related pending todos to the noteable for the note author as done'
do
...
@@ -150,13 +149,6 @@ describe TodoService, services: true do
...
@@ -150,13 +149,6 @@ describe TodoService, services: true do
expect
(
second_todo
.
reload
).
to
be_done
expect
(
second_todo
.
reload
).
to
be_done
end
end
it
'mark related pending todos to the noteable for the award note author as done'
do
service
.
new_note
(
award_note
,
john_doe
)
expect
(
first_todo
.
reload
).
to
be_done
expect
(
second_todo
.
reload
).
to
be_done
end
it
'does not mark related pending todos it is a system note'
do
it
'does not mark related pending todos it is a system note'
do
service
.
new_note
(
system_note
,
john_doe
)
service
.
new_note
(
system_note
,
john_doe
)
...
@@ -286,6 +278,15 @@ describe TodoService, services: true do
...
@@ -286,6 +278,15 @@ describe TodoService, services: true do
expect
(
second_todo
.
reload
).
to
be_done
expect
(
second_todo
.
reload
).
to
be_done
end
end
end
end
describe
'#new_award_emoji'
do
it
'marks related pending todos to the target for the user as done'
do
todo
=
create
(
:todo
,
user:
john_doe
,
project:
project
,
target:
mr_assigned
,
author:
author
)
service
.
new_award_emoji
(
mr_assigned
,
john_doe
)
expect
(
todo
.
reload
).
to
be_done
end
end
end
end
def
should_create_todo
(
attributes
=
{})
def
should_create_todo
(
attributes
=
{})
...
...
spec/services/toggle_award_emoji_service_spec.rb
0 → 100644
View file @
dccf8a9f
require
'spec_helper'
describe
ToggleAwardEmoji
,
services:
true
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
)
}
before
do
project
.
team
<<
[
user
,
:master
]
end
describe
'#execute'
do
it
'removes related todos'
do
expect_any_instance_of
(
TodoService
).
to
receive
(
:new_award_emoji
).
with
(
issue
,
user
)
ToggleAwardEmojiService
.
new
(
project
,
user
).
execute
(
issue
,
"thumbsdown"
)
end
it
'normalizes the emoji name'
do
expect
(
issue
).
to
receive
(
:toggle_award_emoji
).
with
(
"thumbsup"
,
user
)
ToggleAwardEmojiService
.
new
(
project
,
user
).
execute
(
issue
,
":+1:"
)
end
context
'when the emoji is set'
do
it
'removes the emoji'
do
create
(
:award_emoji
,
awardable:
issue
,
user:
user
)
expect
{
ToggleAwardEmojiService
.
new
(
project
,
user
).
execute
(
issue
,
":+1:"
)
}.
to
change
{
AwardEmoji
.
count
}.
by
(
-
1
)
end
end
context
'when the award is not set yet'
do
it
'awards the emoji'
do
expect
{
ToggleAwardEmojiService
.
new
(
project
,
user
).
execute
(
issue
,
":+1:"
)
}.
to
change
{
AwardEmoji
.
count
}.
by
(
1
)
end
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