card 1.20.0 → 1.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/card.gemspec +1 -1
- data/lib/card.rb +7 -3
- data/lib/card/act_manager/stage_director.rb +22 -10
- data/lib/card/cache/persistent.rb +15 -9
- data/lib/card/format/nest.rb +12 -5
- data/lib/card/format/nest/fetch.rb +2 -1
- data/lib/card/format/render.rb +5 -2
- data/lib/card/set/event.rb +7 -1
- data/lib/card/subcards.rb +3 -3
- data/lib/card/view/cache.rb +1 -1
- data/lib/card/view/fetch.rb +17 -5
- data/lib/card/view/options.rb +52 -26
- data/lib/cardio.rb +2 -1
- data/mod/account/spec/set/right/account_spec.rb +17 -3
- data/mod/admin/set/self/admin.rb +0 -2
- data/mod/admin/spec/set/self/admin_spec.rb +14 -11
- data/mod/bootstrap/set/all/bootstrap/helper.rb +27 -29
- data/mod/carrierwave/set/type/file.rb +1 -1
- data/mod/carrierwave/set/type/image.rb +18 -6
- data/mod/core/set/all/collection.rb +33 -7
- data/mod/core/set/all/fetch.rb +16 -3
- data/mod/core/set/all/permissions.rb +6 -12
- data/mod/core/set/all/trash.rb +3 -1
- data/mod/core/spec/set/all/collection_spec.rb +9 -8
- data/mod/email/set/all/notify.rb +27 -17
- data/mod/email/set/right/follow.rb +49 -36
- data/mod/email/set/type/email_template.rb +25 -69
- data/mod/email/set/type/email_template/email_config.rb +63 -0
- data/mod/email/set/type_plus_right/user/follow.rb +3 -3
- data/mod/machines/lib/stylesheets/style_cards.scss +292 -0
- data/mod/pointer/set/abstract/01_pointer.rb +8 -8
- data/mod/pointer/set/abstract/01_pointer/edit.rb +6 -2
- data/mod/prosemirror_editor/lib/javascript/script_prosemirror.js +12283 -11605
- data/mod/prosemirror_editor/lib/javascript/script_prosemirror_config.js.coffee +1 -1
- data/mod/standard/set/abstract/01_search_params.rb +1 -1
- data/mod/standard/set/abstract/search/paging.rb +4 -4
- data/mod/standard/set/all/comment.rb +67 -47
- data/mod/standard/set/all/links.rb +2 -2
- data/mod/standard/set/all/rich_html/content.rb +1 -1
- data/mod/standard/set/all/rich_html/editing.rb +3 -2
- data/mod/standard/set/all/rich_html/form.rb +21 -12
- data/mod/standard/set/all/rich_html/header.rb +9 -0
- data/mod/standard/set/all/rich_html/menu.rb +16 -12
- data/mod/standard/set/all/rich_html/toolbar.rb +140 -130
- data/mod/standard/set/all/rich_html/wrapper.rb +11 -1
- data/mod/standard/set/rstar/rules_editor.rb +2 -34
- data/mod/standard/set/self/search.rb +1 -1
- data/mod/standard/set/type/set.rb +4 -4
- data/mod/standard/spec/set/type/email_template/email_config_spec.rb +218 -0
- data/mod/standard/spec/set/type/email_template_spec.rb +3 -185
- data/spec/lib/card/cache_spec.rb +0 -1
- data/spec/lib/card/format/render_spec.rb +19 -0
- data/spec/lib/card/stage_director_spec.rb +1 -1
- data/tmpsets/set/mod001-core/all/actify.rb +5 -6
- data/tmpsets/set/mod001-core/all/fetch.rb +14 -12
- data/tmpsets/set/mod001-core/all/name.rb +1 -1
- data/tmpsets/set/mod001-core/all/permissions.rb +12 -22
- data/tmpsets/set/mod001-core/all/tracked_attributes.rb +76 -0
- data/tmpsets/set/mod001-core/all/utils.rb +40 -3
- data/tmpsets/set/mod002-history/all/history.rb +1 -2
- data/tmpsets/set/mod008-solid_cache/abstract/solid_cache.rb +1 -1
- data/tmpsets/set/mod013-carrierwave/abstract/attachment.rb +282 -0
- data/tmpsets/set/mod013-carrierwave/type/file.rb +155 -0
- data/tmpsets/set/mod013-carrierwave/type/image.rb +96 -0
- data/tmpsets/set/mod014-admin/self/admin.rb +113 -0
- data/tmpsets/set/mod014-admin/self/admin_info.rb +110 -0
- data/tmpsets/set/mod014-admin/self/version.rb +15 -0
- data/tmpsets/set/mod015-developer/all/event_viz.rb +59 -0
- data/tmpsets/set/mod015-developer/all/view_viz.rb +30 -0
- data/tmpsets/set/mod015-developer/right/debug.rb +96 -0
- metadata +15 -2
@@ -1,5 +1,4 @@
|
|
1
1
|
format :html do
|
2
|
-
|
3
2
|
# Does two main things:
|
4
3
|
# (1) gives CSS classes for styling and
|
5
4
|
# (2) adds card data for javascript - including the "card-slot" class,
|
@@ -13,6 +12,17 @@ format :html do
|
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
15
|
+
def haml_wrap slot=true
|
16
|
+
@slot_view = @current_view
|
17
|
+
debug_slot do
|
18
|
+
haml_tag :div, id: card.cardname.url_key,
|
19
|
+
class: wrap_classes(slot),
|
20
|
+
data: wrap_data do
|
21
|
+
yield
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
def wrap_data
|
17
27
|
{ "card-id" => card.id,
|
18
28
|
"card-name" => h(card.name),
|
@@ -348,40 +348,8 @@ format :html do
|
|
348
348
|
end
|
349
349
|
end
|
350
350
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
view :edit_single_rule, cache: :never do |args|
|
362
|
-
%(<div class="edit-single-rule panel-body">#{render_edit_rule args}</div>)
|
363
|
-
end
|
364
|
-
|
365
|
-
def default_edit_single_rule_args args
|
366
|
-
args[:remote] ||= false
|
367
|
-
args[:success] ||= {
|
368
|
-
card: args[:parent] || card,
|
369
|
-
id: (args[:parent] && args[:parent].cardname.url_key) ||
|
370
|
-
card.cardname.url_key,
|
371
|
-
view: :open,
|
372
|
-
item: nil
|
373
|
-
}
|
374
|
-
default_edit_rule_args args
|
375
|
-
edit_single_rule_button_args args
|
376
|
-
end
|
377
|
-
|
378
|
-
def edit_single_rule_button_args args
|
379
|
-
args[:delete_button] = delete_button args, ".card-slot.related-view"
|
380
|
-
|
381
|
-
args[:cancel_button] =
|
382
|
-
link_to_card args[:success][:id], "Cancel",
|
383
|
-
class: "rule-cancel-button btn btn-default",
|
384
|
-
path: { view: args[:success][:view] }
|
351
|
+
view :edit_single_rule, tags: :unknown_ok, cache: :never do
|
352
|
+
frame() { render_edit_rule }
|
385
353
|
end
|
386
354
|
|
387
355
|
private
|
@@ -5,10 +5,10 @@ format :html do
|
|
5
5
|
COMMON_RULE_SETTINGS =
|
6
6
|
[:create, :read, :update, :delete, :structure, :default, :style].freeze
|
7
7
|
|
8
|
-
view :core do |args|
|
8
|
+
view :core, cache: :never do |args|
|
9
9
|
voo.show :set_label, :rule_navbar
|
10
10
|
voo.hide :set_navbar
|
11
|
-
rule_view =
|
11
|
+
rule_view = params[:rule_view] || :common_rules
|
12
12
|
_render rule_view
|
13
13
|
end
|
14
14
|
|
@@ -186,7 +186,7 @@ format :html do
|
|
186
186
|
return "" if related_sets.size <= 1
|
187
187
|
navbar id, toggle: 'Rules<span class="caret"></span>', toggle_align: :left,
|
188
188
|
class: "slotter toolbar", navbar_type: "inverse",
|
189
|
-
collapsed_content: close_link(
|
189
|
+
collapsed_content: close_link("pull-right visible-xs") do
|
190
190
|
[
|
191
191
|
wrap_with(:span, "Set:", class: "navbar-text hidden-xs"),
|
192
192
|
(wrap_with :ul, class: "nav navbar-nav nav-pills" do
|
@@ -213,7 +213,7 @@ format :html do
|
|
213
213
|
navbar "rule-navbar-#{card.cardname.safe_key}-#{voo.home_view}",
|
214
214
|
toggle: 'Rules<span class="caret"></span>', toggle_align: :left,
|
215
215
|
class: "slotter toolbar", navbar_type: "inverse",
|
216
|
-
collapsed_content: close_link(
|
216
|
+
collapsed_content: close_link("pull-right visible-xs") do
|
217
217
|
[rule_navbar_heading, rule_navbar_content]
|
218
218
|
end
|
219
219
|
end
|
@@ -0,0 +1,218 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require "card/mailer"
|
3
|
+
|
4
|
+
describe Card::Set::Type::EmailTemplate::EmailConfig do
|
5
|
+
let(:email_name) { "a mail template" }
|
6
|
+
let(:email) { Card.fetch(email_name) }
|
7
|
+
|
8
|
+
def mailconfig args={}
|
9
|
+
Card[email_name].email_config(args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def update_field name, args={}
|
13
|
+
Card["#{email_name}+#{name}"].update_attributes! args
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_field name, args={}
|
17
|
+
Card.create! args.merge(name: "#{email_name}+#{name}")
|
18
|
+
end
|
19
|
+
|
20
|
+
before do
|
21
|
+
Card::Auth.current_id = Card::WagnBotID
|
22
|
+
chunk_test = "Url(wagn.org) Link([[http://wagn.org|Wagn]])"\
|
23
|
+
" Inclusion({{B|name}}) Card link([[A]])"
|
24
|
+
Card.create! name: email_name, type: :email_template, subcards: {
|
25
|
+
"+*to" => "joe@user.com",
|
26
|
+
"+*from" => "from@user.com",
|
27
|
+
"+*subject" => "*subject #{chunk_test}",
|
28
|
+
"+*html_message" => "*html message #{chunk_test}",
|
29
|
+
"+*text_message" => "*text message #{chunk_test}"
|
30
|
+
}
|
31
|
+
end
|
32
|
+
describe "address fields" do
|
33
|
+
it "uses *from field" do
|
34
|
+
expect(mailconfig[:from]).to eq "from@user.com"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "uses *to field" do
|
38
|
+
expect(mailconfig[:to]).to eq "joe@user.com"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "handles pointer values" do
|
42
|
+
create_field "*cc", content: "[[joe@user.com]]", type: "Pointer"
|
43
|
+
expect(mailconfig[:cc]).to eq "joe@user.com"
|
44
|
+
end
|
45
|
+
|
46
|
+
# it 'handles email syntax in pointer values' do
|
47
|
+
# create_field '*cc', content: "[[Joe User <joe@user.com>]]",
|
48
|
+
# type: 'Pointer'
|
49
|
+
# expect( mailconfig[:cc] ).to eq 'Joe User <joe@user.com>'
|
50
|
+
# end
|
51
|
+
|
52
|
+
it "handles link to email card" do
|
53
|
+
create_field "*cc", content: "[[Joe User+*email]]", type: "Pointer"
|
54
|
+
expect(mailconfig[:cc]).to eq "joe@user.com"
|
55
|
+
end
|
56
|
+
|
57
|
+
# it 'handles link with valid email address' do
|
58
|
+
# create_field '*cc', content: "[[joe@admin.com|Joe]]", type: 'Phrase'
|
59
|
+
# expect( mailconfig[:cc] ).to eq 'Joe<joe@user.com>'
|
60
|
+
# end
|
61
|
+
|
62
|
+
it "handles search card" do
|
63
|
+
create_field "*bcc", content: '{"name":"Joe Admin","append":"*email"}',
|
64
|
+
type: "Search"
|
65
|
+
expect(mailconfig[:bcc]).to eq "joe@admin.com"
|
66
|
+
end
|
67
|
+
# TODO: not obvious how to deal with that.
|
68
|
+
# it 'handles invalid email address' do
|
69
|
+
# we can't decided whether a email address like [[_left]] is valid;
|
70
|
+
# depends on the context
|
71
|
+
# Card.fetch("a mail template+*to").
|
72
|
+
# update_attributes(content: "invalid mail address")
|
73
|
+
# end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "subject" do
|
77
|
+
subject { mailconfig[:subject] }
|
78
|
+
|
79
|
+
it "uses *subject field" do
|
80
|
+
is_expected.to include "*subject"
|
81
|
+
end
|
82
|
+
it "does not render url" do
|
83
|
+
is_expected.to include "Url(wagn.org)"
|
84
|
+
end
|
85
|
+
it "does not render link" do
|
86
|
+
is_expected.to include "Link(Wagn[http://wagn.org])"
|
87
|
+
end
|
88
|
+
it "renders nest" do
|
89
|
+
is_expected.to include "Inclusion(B)"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "text message" do
|
94
|
+
subject { mailconfig[:text_message] }
|
95
|
+
|
96
|
+
it "uses *text_message field" do
|
97
|
+
is_expected.to include "*text message"
|
98
|
+
end
|
99
|
+
it "does not render url" do
|
100
|
+
is_expected.to include "Url(wagn.org)"
|
101
|
+
end
|
102
|
+
it "renders link" do
|
103
|
+
is_expected.to include "Link(Wagn[http://wagn.org])"
|
104
|
+
end
|
105
|
+
it "renders nest" do
|
106
|
+
is_expected.to include "Inclusion(B)"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "html message" do
|
111
|
+
subject do
|
112
|
+
config = mailconfig
|
113
|
+
config[:context] = Card[email_name]
|
114
|
+
config =
|
115
|
+
Card[email_name].process_html_message(config,
|
116
|
+
{ context: Card[email_name] },
|
117
|
+
nil)
|
118
|
+
# TODO: very hacky to test this; screams for refactoring
|
119
|
+
config[:html_message]
|
120
|
+
end
|
121
|
+
|
122
|
+
it "uses *html_message field" do
|
123
|
+
is_expected.to include "*html message"
|
124
|
+
end
|
125
|
+
it "renders url" do
|
126
|
+
is_expected.to include 'Url(<a target="_blank" class="external-link" '\
|
127
|
+
'href="http://wagn.org">wagn.org</a>)'
|
128
|
+
end
|
129
|
+
it "renders link" do
|
130
|
+
is_expected.to include 'Link(<a target="_blank" class="external-link" '\
|
131
|
+
'href="http://wagn.org">Wagn</a>)'
|
132
|
+
end
|
133
|
+
it "renders nest" do
|
134
|
+
is_expected.to include "Inclusion(B)"
|
135
|
+
end
|
136
|
+
it "renders absolute urls" do
|
137
|
+
Card::Env[:protocol] = "http://"
|
138
|
+
Card::Env[:host] = "www.fake.com"
|
139
|
+
is_expected.to include 'Card link(<a class="known-card" '\
|
140
|
+
'href="http://www.fake.com/A">A</a>)'
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context "with context card" do
|
145
|
+
subject(:config) { mailconfig(context: context_card) }
|
146
|
+
let(:context_card) do
|
147
|
+
file = File.new(File.join(FIXTURES_PATH, "mao2.jpg"))
|
148
|
+
Card.create(
|
149
|
+
name: "Banana",
|
150
|
+
content: "data content [[A]]",
|
151
|
+
subcards: {
|
152
|
+
"+email" => { content: "gary@gary.com" },
|
153
|
+
"+subject" => { type: "Pointer", content: "[[default subject]]" },
|
154
|
+
"+attachment" => { type: "File", file: file }
|
155
|
+
}
|
156
|
+
)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "handles contextual name in address search" do
|
160
|
+
update_field "*from", content: '{"left":"_self", "right":"email"}',
|
161
|
+
type: "Search"
|
162
|
+
expect(config[:from]).to eq "gary@gary.com"
|
163
|
+
end
|
164
|
+
|
165
|
+
it "handles contextual names and structure rules in subject" do
|
166
|
+
Card.create! name: "default subject", content: "a very nutty thang",
|
167
|
+
type: "Phrase"
|
168
|
+
Card.create! name: "subject search+*right+*structure",
|
169
|
+
content: %({"referred_to_by":"_left+subject"}),
|
170
|
+
type: "Search"
|
171
|
+
update_field "*subject", content: "{{+subject search|core|core}}"
|
172
|
+
expect(config[:subject]).to eq("a very nutty thang")
|
173
|
+
end
|
174
|
+
|
175
|
+
it "handles _self in html message" do
|
176
|
+
update_field "*html message", content: "Triggered by {{_self|name}}"
|
177
|
+
mail = email.format.render_mail context: context_card
|
178
|
+
expect(mail.parts[1].body.raw_source).to include("Triggered by Banana")
|
179
|
+
end
|
180
|
+
|
181
|
+
it "handles _left in html message" do
|
182
|
+
update_field "*html_message",
|
183
|
+
content: "Nobody expects {{_left+surprise|core}}"
|
184
|
+
Card.create name: "Banana+surprise", content: "the Spanish Inquisition"
|
185
|
+
c = Card.create name: "Banana+emailtest", content: "data content"
|
186
|
+
mail = email.format.render_mail context: c
|
187
|
+
# c.format.render_mail.parts[1].body.raw_source
|
188
|
+
expected = mail.parts[1].body.raw_source
|
189
|
+
# expected = mailconfig(context: c)[:html_message]
|
190
|
+
expect(expected).to include "Nobody expects the Spanish Inquisition"
|
191
|
+
end
|
192
|
+
|
193
|
+
it "handles image nests in html message" do
|
194
|
+
update_field "*html message", content: "Triggered by {{:logo|core}}"
|
195
|
+
mail = email.format.render_mail context: context_card
|
196
|
+
expect(mail.parts[0].mime_type).to eq "image/png"
|
197
|
+
url = mail.parts[0].url
|
198
|
+
expect(mail.parts[2].mime_type).to eq "text/html"
|
199
|
+
expect(mail.parts[2].body.raw_source).to include('<img src="cid:')
|
200
|
+
expect(mail.parts[2].body.raw_source).to include("<img src=\"#{url}\"")
|
201
|
+
end
|
202
|
+
|
203
|
+
it "handles image nests in html message in default view" do
|
204
|
+
update_field "*html message", content: "Triggered by {{:logo}}"
|
205
|
+
mail = email.format.render_mail context: context_card
|
206
|
+
expect(mail.parts[0].mime_type).to eq "image/png"
|
207
|
+
url = mail.parts[0].url
|
208
|
+
expect(mail.parts[2].mime_type).to eq "text/html"
|
209
|
+
expect(mail.parts[2].body.raw_source).to include('<img src="cid:')
|
210
|
+
expect(mail.parts[2].body.raw_source).to include("<img src=\"#{url}\"")
|
211
|
+
end
|
212
|
+
|
213
|
+
it "handles contextual name for attachments" do
|
214
|
+
create_field "*attach", type: "Pointer", content: "[[_self+attachment]]"
|
215
|
+
expect(config[:attach]).to eq ["Banana+attachment".to_name]
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
@@ -2,38 +2,12 @@
|
|
2
2
|
require "card/mailer"
|
3
3
|
|
4
4
|
describe Card::Set::Type::EmailTemplate do
|
5
|
-
|
6
|
-
let(:email) { Card.fetch(email_name) }
|
7
|
-
|
8
|
-
def mailconfig args={}
|
9
|
-
Card[email_name].email_config(args)
|
10
|
-
end
|
11
|
-
|
12
|
-
def update_field name, args={}
|
13
|
-
Card["#{email_name}+#{name}"].update_attributes! args
|
14
|
-
end
|
15
|
-
|
16
|
-
def create_field name, args={}
|
17
|
-
Card.create! args.merge(name: "#{email_name}+#{name}")
|
18
|
-
end
|
19
|
-
|
20
|
-
before do
|
21
|
-
Card::Auth.current_id = Card::WagnBotID
|
22
|
-
chunk_test = "Url(wagn.org) Link([[http://wagn.org|Wagn]])"\
|
23
|
-
" Inclusion({{B|name}}) Card link([[A]])"
|
24
|
-
Card.create! name: email_name, type: :email_template, subcards: {
|
25
|
-
"+*to" => "joe@user.com",
|
26
|
-
"+*from" => "from@user.com",
|
27
|
-
"+*subject" => "*subject #{chunk_test}",
|
28
|
-
"+*html_message" => "*html message #{chunk_test}",
|
29
|
-
"+*text_message" => "*text message #{chunk_test}"
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
describe "mail view" do
|
5
|
+
describe "view :mail" do
|
34
6
|
let(:content_type) do
|
7
|
+
Card::Auth.current_id = Card::WagnBotID
|
35
8
|
card = Card.create!(name: "content type test", type: :email_template,
|
36
9
|
subcards: @fields)
|
10
|
+
|
37
11
|
email = card.format.render_mail
|
38
12
|
email[:content_type].value
|
39
13
|
end
|
@@ -53,160 +27,4 @@ describe Card::Set::Type::EmailTemplate do
|
|
53
27
|
expect(content_type).to include "multipart/alternative"
|
54
28
|
end
|
55
29
|
end
|
56
|
-
|
57
|
-
describe "#email_config" do
|
58
|
-
describe "address fields" do
|
59
|
-
it "uses *from field" do
|
60
|
-
expect(mailconfig[:from]).to eq "from@user.com"
|
61
|
-
end
|
62
|
-
|
63
|
-
it "uses *to field" do
|
64
|
-
expect(mailconfig[:to]).to eq "joe@user.com"
|
65
|
-
end
|
66
|
-
|
67
|
-
it "handles pointer values" do
|
68
|
-
create_field "*cc", content: "[[joe@user.com]]", type: "Pointer"
|
69
|
-
expect(mailconfig[:cc]).to eq "joe@user.com"
|
70
|
-
end
|
71
|
-
|
72
|
-
# it 'handles email syntax in pointer values' do
|
73
|
-
# create_field '*cc', content: "[[Joe User <joe@user.com>]]",
|
74
|
-
# type: 'Pointer'
|
75
|
-
# expect( mailconfig[:cc] ).to eq 'Joe User <joe@user.com>'
|
76
|
-
# end
|
77
|
-
|
78
|
-
it "handles link to email card" do
|
79
|
-
create_field "*cc", content: "[[Joe User+*email]]", type: "Pointer"
|
80
|
-
expect(mailconfig[:cc]).to eq "joe@user.com"
|
81
|
-
end
|
82
|
-
|
83
|
-
# it 'handles link with valid email address' do
|
84
|
-
# create_field '*cc', content: "[[joe@admin.com|Joe]]", type: 'Phrase'
|
85
|
-
# expect( mailconfig[:cc] ).to eq 'Joe<joe@user.com>'
|
86
|
-
# end
|
87
|
-
|
88
|
-
it "handles search card" do
|
89
|
-
create_field "*bcc", content: '{"name":"Joe Admin","append":"*email"}',
|
90
|
-
type: "Search"
|
91
|
-
expect(mailconfig[:bcc]).to eq "joe@admin.com"
|
92
|
-
end
|
93
|
-
# TODO: not obvious how to deal with that.
|
94
|
-
# it 'handles invalid email address' do
|
95
|
-
# we can't decided whether a email address like [[_left]] is valid;
|
96
|
-
# depends on the context
|
97
|
-
# Card.fetch("a mail template+*to").
|
98
|
-
# update_attributes(content: "invalid mail address")
|
99
|
-
# end
|
100
|
-
end
|
101
|
-
|
102
|
-
describe "subject" do
|
103
|
-
subject { mailconfig[:subject] }
|
104
|
-
|
105
|
-
it "uses *subject field" do
|
106
|
-
is_expected.to include "*subject"
|
107
|
-
end
|
108
|
-
it "does not render url" do
|
109
|
-
is_expected.to include "Url(wagn.org)"
|
110
|
-
end
|
111
|
-
it "does not render link" do
|
112
|
-
is_expected.to include "Link([[http://wagn.org|Wagn]])"
|
113
|
-
end
|
114
|
-
it "renders nest" do
|
115
|
-
is_expected.to include "Inclusion(B)"
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe "text message" do
|
120
|
-
subject { mailconfig[:text_message] }
|
121
|
-
|
122
|
-
it "uses *text_message field" do
|
123
|
-
is_expected.to include "*text message"
|
124
|
-
end
|
125
|
-
it "does not render url" do
|
126
|
-
is_expected.to include "Url(wagn.org)"
|
127
|
-
end
|
128
|
-
it "renders link" do
|
129
|
-
is_expected.to include "Link(Wagn[http://wagn.org])"
|
130
|
-
end
|
131
|
-
it "renders nest" do
|
132
|
-
is_expected.to include "Inclusion(B)"
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "html message" do
|
137
|
-
subject { mailconfig[:html_message] }
|
138
|
-
|
139
|
-
it "uses *html_message field" do
|
140
|
-
is_expected.to include "*html message"
|
141
|
-
end
|
142
|
-
it "renders url" do
|
143
|
-
is_expected.to include 'Url(<a target="_blank" class="external-link" '\
|
144
|
-
'href="http://wagn.org">wagn.org</a>)'
|
145
|
-
end
|
146
|
-
it "renders link" do
|
147
|
-
is_expected.to include 'Link(<a target="_blank" class="external-link" '\
|
148
|
-
'href="http://wagn.org">Wagn</a>)'
|
149
|
-
end
|
150
|
-
it "renders nest" do
|
151
|
-
is_expected.to include "Inclusion(B)"
|
152
|
-
end
|
153
|
-
it "renders absolute urls" do
|
154
|
-
Card::Env[:protocol] = "http://"
|
155
|
-
Card::Env[:host] = "www.fake.com"
|
156
|
-
is_expected.to include 'Card link(<a class="known-card" '\
|
157
|
-
'href="http://www.fake.com/A">A</a>)'
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
context "with context card" do
|
162
|
-
let(:context_card) do
|
163
|
-
file = File.new(File.join FIXTURES_PATH, "mao2.jpg")
|
164
|
-
Card.create(
|
165
|
-
name: "Banana",
|
166
|
-
content: "data content [[A]]",
|
167
|
-
subcards: {
|
168
|
-
"+email" => { content: "gary@gary.com" },
|
169
|
-
"+subject" => { type: "Pointer", content: "[[default subject]]" },
|
170
|
-
"+attachment" => { type: "File", file: file }
|
171
|
-
}
|
172
|
-
)
|
173
|
-
end
|
174
|
-
subject { mailconfig(context: context_card) }
|
175
|
-
|
176
|
-
it "handles contextual name in address search" do
|
177
|
-
update_field "*from", content: '{"left":"_self", "right":"email"}',
|
178
|
-
type: "Search"
|
179
|
-
expect(subject[:from]).to eq "gary@gary.com"
|
180
|
-
end
|
181
|
-
|
182
|
-
it "handles contextual names and structure rules in subject" do
|
183
|
-
Card.create! name: "default subject", content: "a very nutty thang",
|
184
|
-
type: "Phrase"
|
185
|
-
Card.create! name: "subject search+*right+*structure",
|
186
|
-
content: %({"referred_to_by":"_left+subject"}),
|
187
|
-
type: "Search"
|
188
|
-
update_field "*subject", content: "{{+subject search|core|core}}"
|
189
|
-
expect(subject[:subject]).to eq("a very nutty thang")
|
190
|
-
end
|
191
|
-
|
192
|
-
it "handles _self in html message" do
|
193
|
-
update_field "*html message", content: "Triggered by {{_self|name}}"
|
194
|
-
expect(subject[:html_message]).to include("Triggered by Banana")
|
195
|
-
end
|
196
|
-
|
197
|
-
it "handles _left in html message" do
|
198
|
-
update_field "*html_message",
|
199
|
-
content: "Nobody expects {{_left+surprise|core}}"
|
200
|
-
Card.create name: "Banana+surprise", content: "the Spanish Inquisition"
|
201
|
-
c = Card.create name: "Banana+emailtest", content: "data content"
|
202
|
-
expected = mailconfig(context: c)[:html_message]
|
203
|
-
expect(expected).to include "Nobody expects the Spanish Inquisition"
|
204
|
-
end
|
205
|
-
|
206
|
-
it "handles contextual name for attachments" do
|
207
|
-
create_field "*attach", type: "Pointer", content: "[[_self+attachment]]"
|
208
|
-
expect(subject[:attach]).to eq ["Banana+attachment".to_name]
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
30
|
end
|