Skip to content

Commit

Permalink
Refactor Broadcast model and add unit tests for initial properties
Browse files Browse the repository at this point in the history
  • Loading branch information
scubaninja authored Nov 21, 2024
1 parent 30c5466 commit 85644ef
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 43 deletions.
58 changes: 15 additions & 43 deletions server/Models/Broadcast.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,27 @@
using System.Data;
namespace Tailwind.Mail.Models;

//The process of creating a broadcast is:
//The initial data is created first (name, slug)
//The the email and finally the segment to send to, which is done by tag (or not)
//If the initial use case is using a markdown document, then it should contain all
//that we need
// प्रसारण बनाने की प्रक्रिया:
// प्रारंभिक डेटा पहले बनाया जाता है (नाम, स्लग)
// फिर ईमेल और अंत में टैग द्वारा भेजने के लिए सेगमेंट
// यदि प्रारंभिक उपयोग मामला एक मार्कडाउन दस्तावेज़ का उपयोग कर रहा है, तो इसमें वह सब कुछ होना चाहिए जो हमें चाहिए
[Table("broadcasts", Schema = "mail")]
public class Broadcast {
// प्रसारण का ID
public int? ID { get; set; }

// ईमेल का ID
public int? EmailId { get; set; }

// प्रसारण की स्थिति, डिफ़ॉल्ट रूप से "pending"
public string Status { get; set; } = "pending";

// प्रसारण का नाम
public string? Name { get; set; }

// प्रसारण का slug
public string? Slug { get; set; }

// reply-to ईमेल पता
public string? ReplyTo { get; set; }
public string SendToTag { get; set; } = "*";
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
private Broadcast()
{

}
public static Broadcast FromMarkdownEmail(MarkdownEmail doc){
var broadcast = new Broadcast();
broadcast.Name = doc.Data.Subject;
broadcast.Slug = doc.Data.Slug;
broadcast.SendToTag = doc.Data.SendToTag;
return broadcast;
}
public static Broadcast FromMarkdown(string markdown){
var broadcast = new Broadcast();
var doc = MarkdownEmail.FromString(markdown);
broadcast.Name = doc.Data.Subject;
broadcast.Slug = doc.Data.Slug;
broadcast.SendToTag = doc.Data.SendToTag;
return broadcast;
}
public long ContactCount(IDbConnection conn){
//do we have a tag?
long contacts = 0;
if(SendToTag == "*"){
contacts = conn.ExecuteScalar<long>("select count(1) from mail.contacts where subscribed = true");
}else{
var sql = @"
select count(1) as count from mail.contacts
inner join mail.tagged on mail.tagged.contact_id = mail.contacts.id
inner join mail.tags on mail.tags.id = mail.tagged.tag_id
where subscribed = true
and tags.slug = @tagSlug
";
contacts = conn.ExecuteScalar<long>(sql, new {tagSlug = SendToTag});
}
return contacts;
}
}
86 changes: 86 additions & 0 deletions server/Models/tests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using Xunit;
using Tailwind.Mail.Models;

namespace Tailwind.Mail.Tests
{
public class BroadcastTests
{
[Fact]
public void Broadcast_DefaultStatus_ShouldBePending()
{
// Arrange
var broadcast = new Broadcast();

// Act
var status = broadcast.Status;

// Assert
Assert.Equal("pending", status);
}

[Fact]
public void Broadcast_ID_ShouldBeNullInitially()
{
// Arrange
var broadcast = new Broadcast();

// Act
var id = broadcast.ID;

// Assert
Assert.Null(id);
}

[Fact]
public void Broadcast_EmailId_ShouldBeNullInitially()
{
// Arrange
var broadcast = new Broadcast();

// Act
var emailId = broadcast.EmailId;

// Assert
Assert.Null(emailId);
}

[Fact]
public void Broadcast_Name_ShouldBeNullInitially()
{
// Arrange
var broadcast = new Broadcast();

// Act
var name = broadcast.Name;

// Assert
Assert.Null(name);
}

[Fact]
public void Broadcast_Slug_ShouldBeNullInitially()
{
// Arrange
var broadcast = new Broadcast();

// Act
var slug = broadcast.Slug;

// Assert
Assert.Null(slug);
}

[Fact]
public void Broadcast_ReplyTo_ShouldBeNullInitially()
{
// Arrange
var broadcast = new Broadcast();

// Act
var replyTo = broadcast.ReplyTo;

// Assert
Assert.Null(replyTo);
}
}
}

0 comments on commit 85644ef

Please sign in to comment.