Skip to content

Commit e42253a

Browse files
committed
Cleanup Mailto specs
1 parent 0063b88 commit e42253a

File tree

1 file changed

+97
-157
lines changed

1 file changed

+97
-157
lines changed

spec/mailto_spec.rb

Lines changed: 97 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -5,198 +5,136 @@
55
RSpec.describe Supermail::MailTo do
66
describe ".href" do
77
context "with minimal parameters" do
8-
it "generates a simple mailto URL" do
9-
result = described_class.href(to: "test@example.com")
10-
expect(result).to eq("mailto:test@example.com")
11-
end
8+
subject { described_class.href(to: "test@example.com") }
9+
10+
it { is_expected.to eq("mailto:test@example.com") }
1211
end
1312

1413
context "with all parameters" do
15-
let(:params) do
16-
{
14+
subject do
15+
described_class.href(
1716
to: "recipient@example.com",
1817
from: "sender@example.com",
1918
cc: "cc@example.com",
2019
bcc: "bcc@example.com",
2120
subject: "Test Subject",
2221
body: "Test body content"
23-
}
22+
)
2423
end
2524

26-
it "generates a complete mailto URL with query parameters" do
27-
result = described_class.href(**params)
28-
expected_query = [
29-
"from=sender%40example.com",
30-
"cc=cc%40example.com",
31-
"bcc=bcc%40example.com",
32-
"subject=Test%20Subject",
33-
"body=Test%20body%20content"
34-
].join("&")
35-
36-
expect(result).to eq("mailto:recipient@example.com?#{expected_query}")
37-
end
25+
it { is_expected.to start_with("mailto:recipient@example.com?") }
26+
it { is_expected.to include("from=sender%40example.com") }
27+
it { is_expected.to include("cc=cc%40example.com") }
28+
it { is_expected.to include("bcc=bcc%40example.com") }
29+
it { is_expected.to include("subject=Test%20Subject") }
30+
it { is_expected.to include("body=Test%20body%20content") }
3831
end
3932

4033
context "with nil parameters" do
41-
it "excludes nil parameters from the query string" do
42-
result = described_class.href(
34+
subject do
35+
described_class.href(
4336
to: "test@example.com",
4437
from: nil,
4538
subject: "Hello",
4639
cc: nil
4740
)
48-
49-
expect(result).to eq("mailto:test@example.com?subject=Hello")
5041
end
42+
43+
it { is_expected.to eq("mailto:test@example.com?subject=Hello") }
5144
end
5245

5346
context "with empty arrays" do
54-
it "excludes empty arrays from the query string" do
55-
result = described_class.href(
56-
to: "test@example.com",
57-
cc: []
58-
)
47+
subject { described_class.href(to: "test@example.com", cc: []) }
5948

60-
expect(result).to eq("mailto:test@example.com")
61-
end
49+
it { is_expected.to eq("mailto:test@example.com") }
6250
end
6351

6452
context "with special characters" do
65-
it "properly escapes email addresses and content" do
66-
result = described_class.href(
53+
subject do
54+
described_class.href(
6755
to: "test+tag@example.com",
6856
subject: "Hello & Welcome!",
6957
body: "Line 1\nLine 2"
7058
)
71-
72-
expected_query = [
73-
"subject=Hello%20%26%20Welcome%21",
74-
"body=Line%201%0ALine%202"
75-
].join("&")
76-
77-
expect(result).to eq("mailto:test+tag@example.com?#{expected_query}")
7859
end
60+
61+
it { is_expected.to start_with("mailto:test+tag@example.com?") }
62+
it { is_expected.to include("subject=Hello%20%26%20Welcome%21") }
63+
it { is_expected.to include("body=Line%201%0ALine%202") }
7964
end
8065

8166
context "with unicode characters" do
82-
it "properly handles unicode content" do
83-
result = described_class.href(
84-
to: "test@example.com",
85-
subject: "Héllo Wørld! 🎉"
86-
)
67+
subject { described_class.href(to: "test@example.com", subject: "Héllo Wørld! 🎉") }
8768

88-
expect(result).to include("mailto:test@example.com?subject=")
89-
expect(result).to include("H%C3%A9llo")
90-
expect(result).to include("W%C3%B8rld")
91-
end
69+
it { is_expected.to start_with("mailto:test@example.com?subject=") }
70+
it { is_expected.to include("H%C3%A9llo") }
71+
it { is_expected.to include("W%C3%B8rld") }
9272
end
9373

9474
context "with multiple CC recipients" do
95-
it "handles array of CC recipients" do
96-
result = described_class.href(
97-
to: "test@example.com",
98-
cc: ["cc1@example.com", "cc2@example.com"]
99-
)
75+
subject { described_class.href(to: "test@example.com", cc: ["cc1@example.com", "cc2@example.com"]) }
10076

101-
expect(result).to eq("mailto:test@example.com?cc=%5B%22cc1%40example.com%22%2C%20%22cc2%40example.com%22%5D")
102-
end
77+
it { is_expected.to eq("mailto:test@example.com?cc=%5B%22cc1%40example.com%22%2C%20%22cc2%40example.com%22%5D") }
10378
end
10479

10580
context "with multiple BCC recipients" do
106-
it "handles array of BCC recipients" do
107-
result = described_class.href(
108-
to: "test@example.com",
109-
bcc: ["bcc1@example.com", "bcc2@example.com"]
110-
)
81+
subject { described_class.href(to: "test@example.com", bcc: ["bcc1@example.com", "bcc2@example.com"]) }
11182

112-
expect(result).to eq("mailto:test@example.com?bcc=%5B%22bcc1%40example.com%22%2C%20%22bcc2%40example.com%22%5D")
113-
end
83+
it { is_expected.to eq("mailto:test@example.com?bcc=%5B%22bcc1%40example.com%22%2C%20%22bcc2%40example.com%22%5D") }
11484
end
11585
end
11686

11787
describe ".query" do
11888
context "with simple parameters" do
119-
it "generates a proper query string" do
120-
params = { subject: "Hello", body: "World" }
121-
result = described_class.query(**params)
89+
subject { described_class.query(subject: "Hello", body: "World") }
12290

123-
expect(result).to eq("subject=Hello&body=World")
124-
end
91+
it { is_expected.to eq("subject=Hello&body=World") }
12592
end
12693

12794
context "with no parameters" do
128-
it "returns an empty string" do
129-
result = described_class.query
130-
expect(result).to eq("")
131-
end
95+
subject { described_class.query }
96+
97+
it { is_expected.to eq("") }
13298
end
13399

134100
context "with nil values" do
135-
it "excludes nil values from the query string" do
136-
params = { subject: "Hello", from: nil, body: "World" }
137-
result = described_class.query(**params)
101+
subject { described_class.query(subject: "Hello", from: nil, body: "World") }
138102

139-
expect(result).to eq("subject=Hello&body=World")
140-
end
103+
it { is_expected.to eq("subject=Hello&body=World") }
141104
end
142105

143106
context "with special characters" do
144-
it "properly escapes parameter values" do
145-
params = { subject: "Hello & Goodbye", body: "Line 1\nLine 2" }
146-
result = described_class.query(**params)
107+
subject { described_class.query(subject: "Hello & Goodbye", body: "Line 1\nLine 2") }
147108

148-
expect(result).to eq("subject=Hello%20%26%20Goodbye&body=Line%201%0ALine%202")
149-
end
109+
it { is_expected.to eq("subject=Hello%20%26%20Goodbye&body=Line%201%0ALine%202") }
150110
end
151111

152112
context "with mixed parameter types" do
153-
it "handles strings, arrays, and nil values" do
154-
params = {
113+
subject do
114+
described_class.query(
155115
subject: "Test",
156116
cc: ["test1@example.com", "test2@example.com"],
157117
from: nil,
158118
body: ""
159-
}
160-
result = described_class.query(**params)
161-
162-
expect(result).to include("subject=Test")
163-
expect(result).to include("cc=%5B%22test1%40example.com%22%2C%20%22test2%40example.com%22%5D")
164-
expect(result).to include("body=")
165-
expect(result).not_to include("from=")
119+
)
166120
end
121+
122+
it { is_expected.to include("subject=Test") }
123+
it { is_expected.to include("cc=%5B%22test1%40example.com%22%2C%20%22test2%40example.com%22%5D") }
124+
it { is_expected.to include("body=") }
125+
it { is_expected.not_to include("from=") }
167126
end
168127

169128
context "with empty arrays" do
170-
it "excludes empty arrays from query string" do
171-
params = {
172-
subject: "Test",
173-
cc: [],
174-
bcc: [],
175-
from: "test@example.com"
176-
}
177-
result = described_class.query(**params)
178-
179-
expect(result).to eq("subject=Test&from=test%40example.com")
180-
expect(result).not_to include("cc=")
181-
expect(result).not_to include("bcc=")
182-
end
129+
subject { described_class.query(subject: "Test", cc: [], bcc: [], from: "test@example.com") }
130+
131+
it { is_expected.to eq("subject=Test&from=test%40example.com") }
183132
end
184133

185134
context "with mixed empty arrays and nil values" do
186-
it "excludes both empty arrays and nil values from query string" do
187-
params = {
188-
subject: "Test",
189-
cc: [],
190-
bcc: nil,
191-
from: "test@example.com",
192-
body: ""
193-
}
194-
result = described_class.query(**params)
135+
subject { described_class.query(subject: "Test", cc: [], bcc: nil, from: "test@example.com", body: "") }
195136

196-
expect(result).to eq("subject=Test&from=test%40example.com&body=")
197-
expect(result).not_to include("cc=")
198-
expect(result).not_to include("bcc=")
199-
end
137+
it { is_expected.to eq("subject=Test&from=test%40example.com&body=") }
200138
end
201139
end
202140

@@ -205,56 +143,58 @@
205143
expect(described_class.private_methods).to include(:mailto_escape)
206144
end
207145

208-
context "accessing via send" do
209-
it "properly escapes strings" do
210-
result = described_class.send(:mailto_escape, "Hello World")
211-
expect(result).to eq("Hello%20World")
212-
end
146+
context "with simple string" do
147+
subject { described_class.send(:mailto_escape, "Hello World") }
213148

214-
it "converts plus signs to %20" do
215-
result = described_class.send(:mailto_escape, "test+tag@example.com")
216-
expect(result).to eq("test%2Btag%40example.com")
217-
end
149+
it { is_expected.to eq("Hello%20World") }
150+
end
218151

219-
it "handles newlines" do
220-
result = described_class.send(:mailto_escape, "Line 1\nLine 2")
221-
expect(result).to eq("Line%201%0ALine%202")
222-
end
152+
context "with plus signs" do
153+
subject { described_class.send(:mailto_escape, "test+tag@example.com") }
223154

224-
it "handles ampersands" do
225-
result = described_class.send(:mailto_escape, "Hello & Goodbye")
226-
expect(result).to eq("Hello%20%26%20Goodbye")
227-
end
155+
it { is_expected.to eq("test%2Btag%40example.com") }
156+
end
228157

229-
it "converts non-string objects to strings" do
230-
result = described_class.send(:mailto_escape, 123)
231-
expect(result).to eq("123")
232-
end
158+
context "with newlines" do
159+
subject { described_class.send(:mailto_escape, "Line 1\nLine 2") }
233160

234-
it "handles special email characters" do
235-
result = described_class.send(:mailto_escape, "user+tag@example.com")
236-
expect(result).to eq("user%2Btag%40example.com")
237-
end
161+
it { is_expected.to eq("Line%201%0ALine%202") }
162+
end
238163

239-
it "handles carriage returns and line feeds" do
240-
result = described_class.send(:mailto_escape, "Line 1\r\nLine 2")
241-
expect(result).to eq("Line%201%0D%0ALine%202")
242-
end
164+
context "with ampersands" do
165+
subject { described_class.send(:mailto_escape, "Hello & Goodbye") }
243166

244-
it "handles unicode characters" do
245-
result = described_class.send(:mailto_escape, "Héllo 🎉")
246-
expect(result).to include("H%C3%A9llo")
247-
end
167+
it { is_expected.to eq("Hello%20%26%20Goodbye") }
168+
end
248169

249-
it "handles percent signs" do
250-
result = described_class.send(:mailto_escape, "50% off")
251-
expect(result).to eq("50%25%20off")
252-
end
170+
context "with non-string objects" do
171+
subject { described_class.send(:mailto_escape, 123) }
253172

254-
it "handles empty strings" do
255-
result = described_class.send(:mailto_escape, "")
256-
expect(result).to eq("")
257-
end
173+
it { is_expected.to eq("123") }
174+
end
175+
176+
context "with carriage returns and line feeds" do
177+
subject { described_class.send(:mailto_escape, "Line 1\r\nLine 2") }
178+
179+
it { is_expected.to eq("Line%201%0D%0ALine%202") }
180+
end
181+
182+
context "with unicode characters" do
183+
subject { described_class.send(:mailto_escape, "Héllo 🎉") }
184+
185+
it { is_expected.to include("H%C3%A9llo") }
186+
end
187+
188+
context "with percent signs" do
189+
subject { described_class.send(:mailto_escape, "50% off") }
190+
191+
it { is_expected.to eq("50%25%20off") }
192+
end
193+
194+
context "with empty strings" do
195+
subject { described_class.send(:mailto_escape, "") }
196+
197+
it { is_expected.to eq("") }
258198
end
259199
end
260200
end

0 commit comments

Comments
 (0)