Skip to content

Commit da3eb22

Browse files
authored
Merge pull request #349 from codebude/enhancement/345-improvements-on-mail-sms-mms-generator
Refactored SMS, MMS & Mail generator.
2 parents 50a9cef + 6afa358 commit da3eb22

File tree

2 files changed

+100
-64
lines changed

2 files changed

+100
-64
lines changed

QRCoder/PayloadGenerator.cs

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -62,40 +62,15 @@ public class Mail : Payload
6262
private readonly string mailReceiver, subject, message;
6363
private readonly MailEncoding encoding;
6464

65-
/// <summary>
66-
/// Creates an empty email payload
67-
/// </summary>
68-
/// <param name="mailReceiver">Receiver's email address</param>
69-
/// <param name="encoding">Payload encoding type. Choose dependent on your QR Code scanner app.</param>
70-
public Mail(string mailReceiver, MailEncoding encoding = MailEncoding.MAILTO)
71-
{
72-
this.mailReceiver = mailReceiver;
73-
this.subject = this.message = string.Empty;
74-
this.encoding = encoding;
75-
}
76-
77-
/// <summary>
78-
/// Creates an email payload with subject
79-
/// </summary>
80-
/// <param name="mailReceiver">Receiver's email address</param>
81-
/// <param name="subject">Subject line of the email</param>
82-
/// <param name="encoding">Payload encoding type. Choose dependent on your QR Code scanner app.</param>
83-
public Mail(string mailReceiver, string subject, MailEncoding encoding = MailEncoding.MAILTO)
84-
{
85-
this.mailReceiver = mailReceiver;
86-
this.subject = subject;
87-
this.message = string.Empty;
88-
this.encoding = encoding;
89-
}
90-
65+
9166
/// <summary>
9267
/// Creates an email payload with subject and message/text
9368
/// </summary>
9469
/// <param name="mailReceiver">Receiver's email address</param>
9570
/// <param name="subject">Subject line of the email</param>
9671
/// <param name="message">Message content of the email</param>
9772
/// <param name="encoding">Payload encoding type. Choose dependent on your QR Code scanner app.</param>
98-
public Mail(string mailReceiver, string subject, string message, MailEncoding encoding = MailEncoding.MAILTO)
73+
public Mail(string mailReceiver = null, string subject = null, string message = null, MailEncoding encoding = MailEncoding.MAILTO)
9974
{
10075
this.mailReceiver = mailReceiver;
10176
this.subject = subject;
@@ -105,20 +80,26 @@ public Mail(string mailReceiver, string subject, string message, MailEncoding en
10580

10681
public override string ToString()
10782
{
83+
var returnVal = string.Empty;
10884
switch (this.encoding)
10985
{
11086
case MailEncoding.MAILTO:
111-
return
112-
$"mailto:{this.mailReceiver}?subject={System.Uri.EscapeDataString(this.subject)}&body={System.Uri.EscapeDataString(this.message)}";
87+
var parts = new List<string>();
88+
if (!string.IsNullOrEmpty(this.subject))
89+
parts.Add("subject=" + Uri.EscapeDataString(this.subject));
90+
if (!string.IsNullOrEmpty(this.message))
91+
parts.Add("body=" + Uri.EscapeDataString(this.message));
92+
var queryString = parts.Any() ? $"?{string.Join("&", parts.ToArray())}" : "";
93+
returnVal = $"mailto:{this.mailReceiver}{queryString}";
94+
break;
11395
case MailEncoding.MATMSG:
114-
return
115-
$"MATMSG:TO:{this.mailReceiver};SUB:{EscapeInput(this.subject)};BODY:{EscapeInput(this.message)};;";
96+
returnVal = $"MATMSG:TO:{this.mailReceiver};SUB:{EscapeInput(this.subject)};BODY:{EscapeInput(this.message)};;";
97+
break;
11698
case MailEncoding.SMTP:
117-
return
118-
$"SMTP:{this.mailReceiver}:{EscapeInput(this.subject, true)}:{EscapeInput(this.message, true)}";
119-
default:
120-
return this.mailReceiver;
99+
returnVal = $"SMTP:{this.mailReceiver}:{EscapeInput(this.subject, true)}:{EscapeInput(this.message, true)}";
100+
break;
121101
}
102+
return returnVal;
122103
}
123104

124105
public enum MailEncoding
@@ -161,17 +142,26 @@ public SMS(string number, string subject, SMSEncoding encoding = SMSEncoding.SMS
161142

162143
public override string ToString()
163144
{
145+
var returnVal = string.Empty;
164146
switch (this.encoding)
165-
{
147+
{
166148
case SMSEncoding.SMS:
167-
return $"sms:{this.number}?body={System.Uri.EscapeDataString(this.subject)}";
149+
var queryString = string.Empty;
150+
if (!string.IsNullOrEmpty(this.subject))
151+
queryString = $"?body={Uri.EscapeDataString(this.subject)}";
152+
returnVal = $"sms:{this.number}{queryString}";
153+
break;
168154
case SMSEncoding.SMS_iOS:
169-
return $"sms:{this.number};body={System.Uri.EscapeDataString(this.subject)}";
155+
var queryStringiOS = string.Empty;
156+
if (!string.IsNullOrEmpty(this.subject))
157+
queryStringiOS = $";body={Uri.EscapeDataString(this.subject)}";
158+
returnVal = $"sms:{this.number}{queryStringiOS}";
159+
break;
170160
case SMSEncoding.SMSTO:
171-
return $"SMSTO:{this.number}:{this.subject}";
172-
default:
173-
return "sms:";
161+
returnVal = $"SMSTO:{this.number}:{this.subject}";
162+
break;
174163
}
164+
return returnVal;
175165
}
176166

177167
public enum SMSEncoding
@@ -214,15 +204,23 @@ public MMS(string number, string subject, MMSEncoding encoding = MMSEncoding.MMS
214204

215205
public override string ToString()
216206
{
207+
var returnVal = string.Empty;
217208
switch (this.encoding)
218-
{
209+
{
219210
case MMSEncoding.MMSTO:
220-
return $"mmsto:{this.number}?subject={System.Uri.EscapeDataString(this.subject)}";
211+
var queryStringMmsTo = string.Empty;
212+
if (!string.IsNullOrEmpty(this.subject))
213+
queryStringMmsTo = $"?subject={Uri.EscapeDataString(this.subject)}";
214+
returnVal = $"mmsto:{this.number}{queryStringMmsTo}";
215+
break;
221216
case MMSEncoding.MMS:
222-
return $"mms:{this.number}?body={System.Uri.EscapeDataString(this.subject)}";
223-
default:
224-
return "mms:";
217+
var queryStringMms = string.Empty;
218+
if (!string.IsNullOrEmpty(this.subject))
219+
queryStringMms = $"?body={Uri.EscapeDataString(this.subject)}";
220+
returnVal = $"mms:{this.number}{queryStringMms}";
221+
break;
225222
}
223+
return returnVal;
226224
}
227225

228226
public enum MMSEncoding

QRCoderTests/PayloadGeneratorTests.cs

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,58 @@ public void mail_should_build_type_mailto()
437437
}
438438

439439

440+
[Fact]
441+
[Category("PayloadGenerator/Mail")]
442+
public void mail_should_build_type_mailto_receiver_only()
443+
{
444+
var receiver = "[email protected]";
445+
var encoding = PayloadGenerator.Mail.MailEncoding.MAILTO;
446+
447+
var generator = new PayloadGenerator.Mail(mailReceiver: receiver, encoding: encoding);
448+
449+
generator.ToString().ShouldBe("mailto:[email protected]");
450+
}
451+
452+
453+
[Fact]
454+
[Category("PayloadGenerator/Mail")]
455+
public void mail_should_build_type_mailto_subject_only()
456+
{
457+
var receiver = "[email protected]";
458+
var subject = "A test mail";
459+
var encoding = PayloadGenerator.Mail.MailEncoding.MAILTO;
460+
461+
var generator = new PayloadGenerator.Mail(receiver, subject, encoding: encoding);
462+
463+
generator.ToString().ShouldBe("mailto:[email protected]?subject=A%20test%20mail");
464+
}
465+
466+
[Fact]
467+
[Category("PayloadGenerator/Mail")]
468+
public void mail_should_build_type_mailto_message_only()
469+
{
470+
var receiver = "[email protected]";
471+
var message = "Just see if it works!";
472+
var encoding = PayloadGenerator.Mail.MailEncoding.MAILTO;
473+
474+
var generator = new PayloadGenerator.Mail(receiver, message: message, encoding: encoding);
475+
476+
generator.ToString().ShouldBe("mailto:[email protected]?body=Just%20see%20if%20it%20works%21");
477+
}
478+
479+
[Fact]
480+
[Category("PayloadGenerator/Mail")]
481+
public void mail_should_build_type_mailto_no_receiver()
482+
{
483+
var subject = "A test mail";
484+
var message = "Just see if it works!";
485+
var encoding = PayloadGenerator.Mail.MailEncoding.MAILTO;
486+
487+
var generator = new PayloadGenerator.Mail(subject: subject, message: message, encoding: encoding);
488+
489+
generator.ToString().ShouldBe("mailto:?subject=A%20test%20mail&body=Just%20see%20if%20it%20works%21");
490+
}
491+
440492
[Fact]
441493
[Category("PayloadGenerator/Mail")]
442494
public void mail_should_build_type_MATMSG()
@@ -481,7 +533,6 @@ public void mail_should_escape_input_MATMSG()
481533
generator.ToString().ShouldBe("MATMSG:TO:[email protected];SUB:A test mail;BODY:Just see if \\\\\\:\\;\\, it works!;;");
482534
}
483535

484-
485536
[Fact]
486537
[Category("PayloadGenerator/Mail")]
487538
public void mail_should_escape_input_SMTP()
@@ -496,19 +547,6 @@ public void mail_should_escape_input_SMTP()
496547
generator.ToString().ShouldBe("SMTP:[email protected]:A test mail:Just see\\: if it works!");
497548
}
498549

499-
500-
[Fact]
501-
[Category("PayloadGenerator/Mail")]
502-
public void mail_should_add_unused_params()
503-
{
504-
var receiver = "[email protected]";
505-
506-
var generator = new PayloadGenerator.Mail(receiver);
507-
508-
generator.ToString().ShouldBe("mailto:[email protected]?subject=&body=");
509-
}
510-
511-
512550
[Fact]
513551
[Category("PayloadGenerator/SMS")]
514552
public void sms_should_build_type_SMS()
@@ -553,13 +591,13 @@ public void sms_should_build_type_SMSTO()
553591

554592
[Fact]
555593
[Category("PayloadGenerator/SMS")]
556-
public void sms_should_add_unused_params()
594+
public void sms_should_not_add_unused_params()
557595
{
558596
var number = "01601234567";
559597

560598
var generator = new PayloadGenerator.SMS(number);
561599

562-
generator.ToString().ShouldBe("sms:01601234567?body=");
600+
generator.ToString().ShouldBe("sms:01601234567");
563601
}
564602

565603

@@ -593,13 +631,13 @@ public void mms_should_build_type_MMSTO()
593631

594632
[Fact]
595633
[Category("PayloadGenerator/MMS")]
596-
public void mms_should_add_unused_params()
634+
public void mms_should_not_add_unused_params()
597635
{
598636
var number = "01601234567";
599637

600638
var generator = new PayloadGenerator.MMS(number);
601639

602-
generator.ToString().ShouldBe("mms:01601234567?body=");
640+
generator.ToString().ShouldBe("mms:01601234567");
603641
}
604642

605643

0 commit comments

Comments
 (0)