Class To Test
Some methods hidden for clarity
namespace RiPS.Infrastructure.UA
{
public class UAWorkflowManager
{
private readonly IContextIOAPI _api;
private readonly IUAjoinedRepo _dbJoinedRepo;
private readonly IRemindersSystem _remindersSystem;
public UAWorkflowManager(IContextIOAPI contextIOAPI, IUAjoinedRepo uAjoinedRepo, IRemindersSystem remindersSystem)
{
_api = contextIOAPI;
_dbJoinedRepo = uAjoinedRepo;
_remindersSystem = remindersSystem;
}
public bool Assign(MongoUAJoinedWorkflow wf,string username, IUAWorkflowHub hub)
{
if (String.IsNullOrEmpty(wf.UA))
{
hub.Error("Assignment Error", "Must have UA to assign");
return false;
}
if (wf.TaskReqs.Count < 1)
{
hub.Error("Assignment Error", "Must have tasks");
return false;
}
foreach (var req in wf.TaskReqs)
{
if (String.IsNullOrEmpty(req.Note))
{
hub.Error("Assignment Error", "All Tasks must have notes");
return false;
}
if (String.IsNullOrEmpty(req.Title))
{
hub.Error("Assignment Error", "All Tasks must have titles. Must be an error ");
return false;
}
}
wf.Assigned = true;
wf.AssignedBy = username;
wf.AssignedDate = DateTime.UtcNow;
var msg = GenerateMessage(wf);
msg.Body = RenderViewToString(wf);
var str = CreateStream(wf, hub);
var fileName = str.Item1;
var stream = str.Item2;
AttachMessage(msg, stream, fileName);
hub.Info("Assigning", "Sending Email");
RetryUtility.RetryAction(() => SendMessage(msg));
stream.Position = 0;
hub.Info("Task", "adding");
foreach (var taskReq in wf.TaskReqs)
{
var r = _remindersSystem.AddReminder(new MongoReminder(wf.clientId, wf.policyId, wf.UA, "UAWF", taskReq.DueDate, taskReq.Title), stream, fileName);
wf.ReminderGuids.Add(r.Id);
stream.Position = 0;
}
_dbJoinedRepo.Save(wf);
hub.Info("Task", "added");
hub.Info("Assigning", "Moving Email To Assigned Folder");
RetryUtility.RetryAction(() => MoveToFolder(wf.MessageId, "Assigned"));
hub.Info("Assigning", "Saving Assignment to Database");
wf.Error = "";
hub.Update(wf);
hub.Success("Assigned", wf.Subject);
return true;
}
}
}
Test Class (nUnit & Moq)
namespace RiPSTests
{
[TestFixture]
public class UAWF
{
private Mock<IContextIOAPI> mock;
private Mock<IUAjoinedRepo> repoMock;
private Mock<IUAWorkflowHub> hubMock;
private Mock<IRemindersSystem> reminderMock;
private const string ConstSampleUA = "FAKEUA";
private const string ConstSampleNote = "FAKENote";
private const string ConstSampleTitle = "FAKETitle";
[SetUp]
public void setup()
{
mock = new Mock<IContextIOAPI>();
repoMock = new Mock<IUAjoinedRepo>();
hubMock = new Mock<IUAWorkflowHub>();
reminderMock = new Mock<IRemindersSystem>();
}
[Test]
public void CanSetup()
{
var man = new UAWorkflowManager(mock.Object, repoMock.Object, reminderMock.Object);
Assert.NotNull(man);
}
[Test]
public void FailMustHaveUA()
{
//Arrange
var man = new UAWorkflowManager(mock.Object, repoMock.Object, reminderMock.Object);
var wf = new MongoUAJoinedWorkflow();
//Act
var res = man.Assign(wf, ConstSampleUA, hubMock.Object);
//Assert
Assert.IsFalse(res);
hubMock.Verify(z => z.Error("Assignment Error", "Must have UA to assign"), Times.Exactly(1));
}
[Test]
public void FailMustHaveTasks()
{
//Arrange
var man = new UAWorkflowManager(mock.Object, repoMock.Object, reminderMock.Object);
var wf = new MongoUAJoinedWorkflow()
{
UA = ConstSampleUA
};
//Act
var res = man.Assign(wf, ConstSampleUA, hubMock.Object);
//Assert
Assert.IsFalse(res);
hubMock.Verify(z => z.Error("Assignment Error", "Must have tasks"), Times.Exactly(1));
}
[Test]
public void FailTasksMustHaveNote()
{
//Arrange
var man = new UAWorkflowManager(mock.Object, repoMock.Object, reminderMock.Objects);
var wf = new MongoUAJoinedWorkflow()
{
UA = ConstSampleUA,
TaskReqs = new List<TaskReq>()
{
new TaskReq()
{
DueDate = DateTime.Today,
Title = ConstSampleTitle
}
}
};
//Act
var res = man.Assign(wf, ConstSampleUA, hubMock.Object);
//Assert
Assert.IsFalse(res);
hubMock.Verify(z => z.Error("Assignment Error", "All Tasks must have notes"), Times.Exactly(1));
}
}
}
Test feel awfully verbose and brittle. Writing Tests Second (Need to do some overhaul and was unable to test the first time because i am not a strong tester)