Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
3acbbb1a
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
3acbbb1a
编写于
10月 09, 2017
作者:
R
Rémy Coutable
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Don't show an "Unsubscribe" link in snippet comment notifications
Signed-off-by:
N
Rémy Coutable
<
remy@rymai.me
>
上级
f277fa14
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
390 addition
and
234 deletion
+390
-234
app/models/sent_notification.rb
app/models/sent_notification.rb
+5
-1
changelogs/unreleased/23888-fix-unsubscription-link-for-snippet-notification.yml
...3888-fix-unsubscription-link-for-snippet-notification.yml
+5
-0
spec/mailers/notify_spec.rb
spec/mailers/notify_spec.rb
+260
-231
spec/models/sent_notification_spec.rb
spec/models/sent_notification_spec.rb
+120
-2
未找到文件。
app/models/sent_notification.rb
浏览文件 @
3acbbb1a
...
...
@@ -53,13 +53,17 @@ class SentNotification < ActiveRecord::Base
end
def
unsubscribable?
!
for_commit?
!
(
for_commit?
||
for_snippet?
)
end
def
for_commit?
noteable_type
==
"Commit"
end
def
for_snippet?
noteable_type
.
end_with?
(
'Snippet'
)
end
def
noteable
if
for_commit?
project
.
commit
(
commit_id
)
rescue
nil
...
...
changelogs/unreleased/23888-fix-unsubscription-link-for-snippet-notification.yml
0 → 100644
浏览文件 @
3acbbb1a
---
title
:
Don't show an "Unsubscribe" link in snippet comment notifications
merge_request
:
14764
author
:
type
:
fixed
spec/mailers/notify_spec.rb
浏览文件 @
3acbbb1a
...
...
@@ -28,319 +28,334 @@ describe Notify do
end
def
have_referable_subject
(
referable
,
reply:
false
)
prefix
=
referable
.
project
.
name
if
referable
.
project
prefix
=
"Re:
#{
prefix
}
"
if
reply
prefix
=
referable
.
project
?
"
#{
referable
.
project
.
name
}
| "
:
''
prefix
.
prepend
(
'Re: '
)
if
reply
suffix
=
"
#{
referable
.
title
}
(
#{
referable
.
to_reference
}
)"
have_subject
[
prefix
,
suffix
].
compact
.
join
(
' | '
)
have_subject
[
prefix
,
suffix
].
compact
.
join
end
context
'for a project'
do
describe
'items that are assignable, the email'
do
let
(
:previous_assignee
)
{
create
(
:user
,
name:
'Previous Assignee'
)
}
shared_examples
'an assignee email'
do
it
'is sent to the assignee as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
.
first
aggregate_failures
do
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
expect
(
subject
).
to
deliver_to
(
assignee
.
email
)
end
end
end
shared_examples
'an assignee email
'
do
it
'is sent to the assignee as the author
'
do
sender
=
subject
.
header
[
:from
].
addrs
.
first
context
'for issues
'
do
describe
'that are new
'
do
subject
{
described_class
.
new_issue_email
(
issue
.
assignees
.
first
.
id
,
issue
.
id
)
}
it_behaves_like
'an assignee email'
it_behaves_like
'an email starting a new thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
it
'has the correct subject and body'
do
aggregate_failures
do
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
expect
(
subject
).
to
deliver_to
(
assignee
.
email
)
is_expected
.
to
have_referable_subject
(
issue
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
end
end
context
'for issues
'
do
describe
'that are new'
do
subject
{
described_class
.
new_issue_email
(
issue
.
assignees
.
first
.
id
,
issue
.
id
)
}
it
'contains the description
'
do
is_expected
.
to
have_html_escaped_body_text
issue
.
description
end
it_behaves_like
'an assignee email'
it_behaves_like
'an email starting a new thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
context
'when enabled email_author_in_body'
do
before
do
stub_application_setting
(
email_author_in_body:
true
)
end
it
'contains the description'
do
is_expected
.
to
have_html_escaped_body_text
issue
.
description
it
'contains a link to note author'
do
is_expected
.
to
have_html_escaped_body_text
(
issue
.
author_name
)
is_expected
.
to
have_body_text
'created an issue:'
end
end
end
context
'when enabled email_author_in_body'
do
before
do
stub_application_setting
(
email_author_in_body:
true
)
end
describe
'that are reassigned'
do
let
(
:previous_assignee
)
{
create
(
:user
,
name:
'Previous Assignee'
)
}
subject
{
described_class
.
reassigned_issue_email
(
recipient
.
id
,
issue
.
id
,
[
previous_assignee
.
id
],
current_user
.
id
)
}
it
'contains a link to note author'
do
is_expected
.
to
have_html_escaped_body_text
(
issue
.
author_name
)
is_expected
.
to
have_body_text
'created an issue:'
end
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
describe
'that have been reassigned'
do
subject
{
described_class
.
reassigned_issue_email
(
recipient
.
id
,
issue
.
id
,
[
previous_assignee
.
id
],
current_user
.
id
)
}
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_html_escaped_body_text
(
previous_assignee
.
name
)
is_expected
.
to
have_html_escaped_body_text
(
assignee
.
name
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
end
end
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
describe
'that have been relabeled'
do
subject
{
described_class
.
relabeled_issue_email
(
recipient
.
id
,
issue
.
id
,
%w[foo bar baz]
,
current_user
.
id
)
}
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_html_escaped_body_text
(
previous_assignee
.
name
)
is_expected
.
to
have_html_escaped_body_text
(
assignee
.
name
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'a user cannot unsubscribe through footer link'
it_behaves_like
'an email with a labels subscriptions link in its footer'
describe
'that have been relabeled'
do
subject
{
described_class
.
relabeled_issue_email
(
recipient
.
id
,
issue
.
id
,
%w[foo bar baz]
,
current_user
.
id
)
}
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_body_text
(
'foo, bar, and baz'
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'a user cannot unsubscribe through footer link'
it_behaves_like
'an email with a labels subscriptions link in its footer'
end
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
context
'with a preferred language'
do
before
do
Gitlab
::
I18n
.
locale
=
:es
end
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_body_text
(
'foo, bar, and baz'
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
after
do
Gitlab
::
I18n
.
use_default_locale
end
context
'with a preferred language'
do
before
do
Gitlab
::
I18n
.
locale
=
:es
end
after
do
Gitlab
::
I18n
.
use_default_locale
end
it
'always generates the email using the default language'
do
is_expected
.
to
have_body_text
(
'foo, bar, and baz'
)
end
it
'always generates the email using the default language'
do
is_expected
.
to
have_body_text
(
'foo, bar, and baz'
)
end
end
end
describe
'status changed'
do
let
(
:status
)
{
'closed'
}
subject
{
described_class
.
issue_status_changed_email
(
recipient
.
id
,
issue
.
id
,
status
,
current_user
.
id
)
}
describe
'status changed'
do
let
(
:status
)
{
'closed'
}
subject
{
described_class
.
issue_status_changed_email
(
recipient
.
id
,
issue
.
id
,
status
,
current_user
.
id
)
}
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_body_text
(
status
)
is_expected
.
to
have_html_escaped_body_text
(
current_user
.
name
)
is_expected
.
to
have_body_text
(
project_issue_path
project
,
issue
)
end
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_body_text
(
status
)
is_expected
.
to
have_html_escaped_body_text
(
current_user
.
name
)
is_expected
.
to
have_body_text
(
project_issue_path
project
,
issue
)
end
end
end
describe
'moved to another project'
do
let
(
:new_issue
)
{
create
(
:issue
)
}
subject
{
described_class
.
issue_moved_email
(
recipient
,
issue
,
new_issue
,
current_user
)
}
describe
'moved to another project'
do
let
(
:new_issue
)
{
create
(
:issue
)
}
subject
{
described_class
.
issue_moved_email
(
recipient
,
issue
,
new_issue
,
current_user
)
}
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
issue
}
end
it_behaves_like
'it should show Gmail Actions View Issue link'
it_behaves_like
'an unsubscribeable thread'
it
'contains description about action taken'
do
is_expected
.
to
have_body_text
'Issue was moved to another project'
end
it
'contains description about action taken'
do
is_expected
.
to
have_body_text
'Issue was moved to another project'
end
it
'has the correct subject and body'
do
new_issue_url
=
project_issue_path
(
new_issue
.
project
,
new_issue
)
it
'has the correct subject and body'
do
new_issue_url
=
project_issue_path
(
new_issue
.
project
,
new_issue
)
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_body_text
(
new_issue_url
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
issue
,
reply:
true
)
is_expected
.
to
have_body_text
(
new_issue_url
)
is_expected
.
to
have_body_text
(
project_issue_path
(
project
,
issue
))
end
end
end
end
context
'for merge requests'
do
describe
'that are new'
do
subject
{
described_class
.
new_merge_request_email
(
merge_request
.
assignee_id
,
merge_request
.
id
)
}
context
'for merge requests'
do
describe
'that are new'
do
subject
{
described_class
.
new_merge_request_email
(
merge_request
.
assignee_id
,
merge_request
.
id
)
}
it_behaves_like
'an assignee email'
it_behaves_like
'an email starting a new thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'an unsubscribeable thread'
it_behaves_like
'an assignee email'
it_behaves_like
'an email starting a new thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
is_expected
.
to
have_body_text
(
merge_request
.
source_branch
)
is_expected
.
to
have_body_text
(
merge_request
.
target_branch
)
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'an unsubscribeable thread'
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
is_expected
.
to
have_body_text
(
merge_request
.
source_branch
)
is_expected
.
to
have_body_text
(
merge_request
.
target_branch
)
end
end
it
'contains the description'
do
is_expected
.
to
have_html_escaped_body_text
merge_request
.
description
end
context
'when enabled email_author_in_body'
do
before
do
stub_application_setting
(
email_author_in_body:
true
)
end
it
'contains the description'
do
is_expected
.
to
have_html_escaped_body_text
merge_request
.
description
it
'contains a link to note author'
do
is_expected
.
to
have_html_escaped_body_text
merge_request
.
author_name
is_expected
.
to
have_body_text
'created a merge request:'
end
end
end
context
'when enabled email_author_in_body'
do
before
do
stub_application_setting
(
email_author_in_body:
true
)
end
describe
'that are reassigned'
do
let
(
:previous_assignee
)
{
create
(
:user
,
name:
'Previous Assignee'
)
}
subject
{
described_class
.
reassigned_merge_request_email
(
recipient
.
id
,
merge_request
.
id
,
previous_assignee
.
id
,
current_user
.
id
)
}
it
'contains a link to note author'
do
is_expected
.
to
have_html_escaped_body_text
merge_request
.
author_name
is_expected
.
to
have_body_text
'created a merge request:'
end
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
"an unsubscribeable thread"
describe
'that are reassigned'
do
subject
{
described_class
.
reassigned_merge_request_email
(
recipient
.
id
,
merge_request
.
id
,
previous_assignee
.
id
,
current_user
.
id
)
}
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_html_escaped_body_text
(
previous_assignee
.
name
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
is_expected
.
to
have_html_escaped_body_text
(
assignee
.
name
)
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
"an unsubscribeable thread"
end
end
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
describe
'that have been relabeled'
do
subject
{
described_class
.
relabeled_merge_request_email
(
recipient
.
id
,
merge_request
.
id
,
%w[foo bar baz]
,
current_user
.
id
)
}
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_html_escaped_body_text
(
previous_assignee
.
name
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
is_expected
.
to
have_html_escaped_body_text
(
assignee
.
name
)
end
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'a user cannot unsubscribe through footer link'
it_behaves_like
'an email with a labels subscriptions link in its footer'
describe
'that have been relabeled'
do
subject
{
described_class
.
relabeled_merge_request_email
(
recipient
.
id
,
merge_request
.
id
,
%w[foo bar baz]
,
current_user
.
id
)
}
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'a user cannot unsubscribe through footer link'
it_behaves_like
'an email with a labels subscriptions link in its footer'
it
'has the correct subject and body'
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_body_text
(
'foo, bar, and baz'
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
end
end
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
describe
'status changed'
do
let
(
:status
)
{
'reopened'
}
subject
{
described_class
.
merge_request_status_email
(
recipient
.
id
,
merge_request
.
id
,
status
,
current_user
.
id
)
}
it
'has the correct subject and body'
do
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'an unsubscribeable thread'
it
'is sent as the author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_user
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_body_text
(
'foo, bar, and baz'
)
is_expected
.
to
have_body_text
(
status
)
is_expected
.
to
have_html_escaped_body_text
(
current_user
.
name
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
end
end
end
describe
'status chan
ged'
do
let
(
:status
)
{
'reopened'
}
subject
{
described_class
.
merge_request_status_email
(
recipient
.
id
,
merge_request
.
id
,
status
,
current_use
r
.
id
)
}
describe
'that are mer
ged'
do
let
(
:merge_author
)
{
create
(
:user
)
}
subject
{
described_class
.
merged_merge_request_email
(
recipient
.
id
,
merge_request
.
id
,
merge_autho
r
.
id
)
}
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'an unsubscribeable thread'
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'an unsubscribeable thread'
it
'is sent as th
e author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
current_use
r
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it
'is sent as the merg
e author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
merge_autho
r
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_body_text
(
status
)
is_expected
.
to
have_html_escaped_body_text
(
current_user
.
name
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
end
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_body_text
(
'merged'
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
end
end
end
end
describe
'that are merged
'
do
let
(
:merge_author
)
{
create
(
:user
)
}
subject
{
described_class
.
merged_merge_request_email
(
recipient
.
id
,
merge_request
.
id
,
merge_author
.
id
)
}
context
'for snippet notes
'
do
let
(
:project_snippet
)
{
create
(
:project_snippet
,
project:
project
)
}
let
(
:project_snippet_note
)
{
create
(
:note_on_project_snippet
,
project:
project
,
noteable:
project_snippet
)
}
it_behaves_like
'a multiple recipients email'
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
merge_request
}
end
it_behaves_like
'it should show Gmail Actions View Merge request link'
it_behaves_like
'an unsubscribeable thread'
subject
{
described_class
.
note_snippet_email
(
project_snippet_note
.
author_id
,
project_snippet_note
.
id
)
}
it
'is sent as the merge author'
do
sender
=
subject
.
header
[
:from
].
addrs
[
0
]
expect
(
sender
.
display_name
).
to
eq
(
merge_author
.
name
)
expect
(
sender
.
address
).
to
eq
(
gitlab_sender
)
end
it_behaves_like
'an answer to an existing thread with reply-by-email enabled'
do
let
(
:model
)
{
project_snippet
}
end
it_behaves_like
'a user cannot unsubscribe through footer link'
it
'has the correct subject and body'
do
aggregate_failures
do
is_expected
.
to
have_referable_subject
(
merge_request
,
reply:
true
)
is_expected
.
to
have_body_text
(
'merged'
)
is_expected
.
to
have_body_text
(
project_merge_request_path
(
project
,
merge_request
))
end
end
end
it
'has the correct subject and body'
do
is_expected
.
to
have_referable_subject
(
project_snippet
,
reply:
true
)
is_expected
.
to
have_html_escaped_body_text
project_snippet_note
.
note
end
end
...
...
@@ -1239,4 +1254,18 @@ describe Notify do
end
end
end
context
'for personal snippet notes'
do
let
(
:personal_snippet
)
{
create
(
:personal_snippet
)
}
let
(
:personal_snippet_note
)
{
create
(
:note_on_personal_snippet
,
noteable:
personal_snippet
)
}
subject
{
described_class
.
note_personal_snippet_email
(
personal_snippet_note
.
author_id
,
personal_snippet_note
.
id
)
}
it_behaves_like
'a user cannot unsubscribe through footer link'
it
'has the correct subject and body'
do
is_expected
.
to
have_referable_subject
(
personal_snippet
,
reply:
true
)
is_expected
.
to
have_html_escaped_body_text
personal_snippet_note
.
note
end
end
end
spec/models/sent_notification_spec.rb
浏览文件 @
3acbbb1a
require
'spec_helper'
describe
SentNotification
do
set
(
:user
)
{
create
(
:user
)
}
set
(
:project
)
{
create
(
:project
)
}
describe
'validation'
do
describe
'note validity'
do
context
"when the project doesn't match the noteable's project"
do
...
...
@@ -34,7 +37,6 @@ describe SentNotification do
end
describe
'.record'
do
let
(
:user
)
{
create
(
:user
)
}
let
(
:issue
)
{
create
(
:issue
)
}
it
'creates a new SentNotification'
do
...
...
@@ -43,7 +45,6 @@ describe SentNotification do
end
describe
'.record_note'
do
let
(
:user
)
{
create
(
:user
)
}
let
(
:note
)
{
create
(
:diff_note_on_merge_request
)
}
it
'creates a new SentNotification'
do
...
...
@@ -51,6 +52,123 @@ describe SentNotification do
end
end
describe
'#unsubscribable?'
do
shared_examples
'an unsubscribable notification'
do
|
noteable_type
|
subject
{
described_class
.
record
(
noteable
,
user
.
id
)
}
context
"for
#{
noteable_type
}
"
do
it
{
expect
(
subject
).
to
be_unsubscribable
}
end
end
shared_examples
'a non-unsubscribable notification'
do
|
noteable_type
|
subject
{
described_class
.
record
(
noteable
,
user
.
id
)
}
context
"for a
#{
noteable_type
}
"
do
it
{
expect
(
subject
).
not_to
be_unsubscribable
}
end
end
it_behaves_like
'an unsubscribable notification'
,
'issue'
do
let
(
:noteable
)
{
create
(
:issue
,
project:
project
)
}
end
it_behaves_like
'an unsubscribable notification'
,
'merge request'
do
let
(
:noteable
)
{
create
(
:merge_request
,
source_project:
project
)
}
end
it_behaves_like
'a non-unsubscribable notification'
,
'commit'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:noteable
)
{
project
.
commit
}
end
it_behaves_like
'a non-unsubscribable notification'
,
'personal snippet'
do
let
(
:noteable
)
{
create
(
:personal_snippet
,
project:
project
)
}
end
it_behaves_like
'a non-unsubscribable notification'
,
'project snippet'
do
let
(
:noteable
)
{
create
(
:project_snippet
,
project:
project
)
}
end
end
describe
'#for_commit?'
do
shared_examples
'a commit notification'
do
|
noteable_type
|
subject
{
described_class
.
record
(
noteable
,
user
.
id
)
}
context
"for
#{
noteable_type
}
"
do
it
{
expect
(
subject
).
to
be_for_commit
}
end
end
shared_examples
'a non-commit notification'
do
|
noteable_type
|
subject
{
described_class
.
record
(
noteable
,
user
.
id
)
}
context
"for a
#{
noteable_type
}
"
do
it
{
expect
(
subject
).
not_to
be_for_commit
}
end
end
it_behaves_like
'a non-commit notification'
,
'issue'
do
let
(
:noteable
)
{
create
(
:issue
,
project:
project
)
}
end
it_behaves_like
'a non-commit notification'
,
'merge request'
do
let
(
:noteable
)
{
create
(
:merge_request
,
source_project:
project
)
}
end
it_behaves_like
'a commit notification'
,
'commit'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:noteable
)
{
project
.
commit
}
end
it_behaves_like
'a non-commit notification'
,
'personal snippet'
do
let
(
:noteable
)
{
create
(
:personal_snippet
,
project:
project
)
}
end
it_behaves_like
'a non-commit notification'
,
'project snippet'
do
let
(
:noteable
)
{
create
(
:project_snippet
,
project:
project
)
}
end
end
describe
'#for_snippet?'
do
shared_examples
'a snippet notification'
do
|
noteable_type
|
subject
{
described_class
.
record
(
noteable
,
user
.
id
)
}
context
"for
#{
noteable_type
}
"
do
it
{
expect
(
subject
).
to
be_for_snippet
}
end
end
shared_examples
'a non-snippet notification'
do
|
noteable_type
|
subject
{
described_class
.
record
(
noteable
,
user
.
id
)
}
context
"for a
#{
noteable_type
}
"
do
it
{
expect
(
subject
).
not_to
be_for_snippet
}
end
end
it_behaves_like
'a non-snippet notification'
,
'issue'
do
let
(
:noteable
)
{
create
(
:issue
,
project:
project
)
}
end
it_behaves_like
'a non-snippet notification'
,
'merge request'
do
let
(
:noteable
)
{
create
(
:merge_request
,
source_project:
project
)
}
end
it_behaves_like
'a non-snippet notification'
,
'commit'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:noteable
)
{
project
.
commit
}
end
it_behaves_like
'a snippet notification'
,
'personal snippet'
do
let
(
:noteable
)
{
create
(
:personal_snippet
,
project:
project
)
}
end
it_behaves_like
'a snippet notification'
,
'project snippet'
do
let
(
:noteable
)
{
create
(
:project_snippet
,
project:
project
)
}
end
end
describe
'#create_reply'
do
context
'for issue'
do
let
(
:issue
)
{
create
(
:issue
)
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录