Skip to content

Instantly share code, notes, and snippets.

@ptabatt
Created January 4, 2024 00:37
Show Gist options
  • Select an option

  • Save ptabatt/5d4c87d4b2ff388d219523b0c809e720 to your computer and use it in GitHub Desktop.

Select an option

Save ptabatt/5d4c87d4b2ff388d219523b0c809e720 to your computer and use it in GitHub Desktop.
[TestFixture]
public class TodoListTestFixture
{
/// <summary>
/// Note to Reviewers:
/// Under normal circumstances, I would create a separate database for the tests, run everything,
/// and then delete the test database.
/// </summary>
[OneTimeSetUp]
public void OneTimeSetup()
{
using (var db = new TodoDbContext())
{
db.Database.EnsureCreated();
}
}
[SetUp]
public void Setup()
{
var repo = new TodoListRepository();
repo.DeleteAll();
Assert.That(repo.Count(), Is.EqualTo(0));
}
/// <summary>
/// If you're unfamiliar with NUnit - the TestCase attribute in NUnit requires constant expressions
/// for its parameters, which means you can't directly non-constant values. In this case,
/// you can use the TestCaseSource attribute along with a method that returns an array of test cases.
/// </summary>
private static IEnumerable<TestCaseData> AddTestCases()
{
yield return new TestCaseData(new TodoItem[] { }, 0).SetName("EmptyArray");
yield return new TestCaseData(new TodoItem[]
{
new TodoItem
{
Task = "jiggy",
IsCompleted = false,
CreatedAt = DateTime.Now
},
new TodoItem
{
Task = "wiggy",
IsCompleted = false,
CreatedAt = DateTime.Now
},
}, 2).SetName("TwoItems");
yield return new TestCaseData(new TodoItem[]
{
new TodoItem
{
Task = "jiggy",
IsCompleted = false,
CreatedAt = DateTime.Now
},
new TodoItem
{
Task = "wiggy",
IsCompleted = false,
CreatedAt = DateTime.Now
},
new TodoItem
{
Task = "jiggywiggy",
IsCompleted = false,
CreatedAt = DateTime.Now
},
}, 3).SetName("ThreeItems");
}
[TestCaseSource(nameof(AddTestCases))]
public void Add_Test(TodoItem[] todoItems, int expectedCount)
{
// Arrange
var repo = new TodoListRepository();
// Act
foreach (var item in todoItems)
{
repo.Add(item);
}
// Assert
Assert.That(repo.Count(), Is.EqualTo(expectedCount));
}
[Test]
public void GetAll_Test()
{
// Arrange
var repository = new TodoListRepository();
var todoItems = new TodoItem[]
{
new TodoItem { Task = "Write Add Test", IsCompleted = true },
new TodoItem { Task = "Write Get All Test", IsCompleted = true },
new TodoItem { Task = "Write Get Nth Item Test", IsCompleted = false },
new TodoItem { Task = "Write Update Item Test", IsCompleted = false }
};
foreach (var item in todoItems)
{
repository.Add(item);
}
// Act
var result = repository.GetAll();
// Assert
Assert.IsNotNull(result);
Assert.That(result.Count(), Is.EqualTo(todoItems.Length));
// Check if all added items are present in the result
foreach (var item in todoItems)
{
Assert.IsTrue(result.Any(i => string.Equals(i.Task, item.Task) && i.IsCompleted == item.IsCompleted));
}
}
[Test]
public void GetNthItem_Test()
{
// Arrange
var repository = new TodoListRepository();
// Create sample todo items
var todoItems = new TodoItem[]
{
new TodoItem { Task = "Write Add Test", IsCompleted = true },
new TodoItem { Task = "Write Get All Test", IsCompleted = true },
new TodoItem { Task = "Write Get Nth Item Test", IsCompleted = true },
new TodoItem { Task = "Write Update Item Test", IsCompleted = false }
};
// Add items to the repository
foreach (var item in todoItems)
{
repository.Add(item);
}
Assert.That(repository.GetNthItem(3).Task, Is.EqualTo("Write Get Nth Item Test"));
Assert.That(repository.GetNthItem(3).IsCompleted, Is.True);
}
[Test]
public void Update_Test()
{
// Arrange
var repository = new TodoListRepository();
var todoItem = new TodoItem { Task = "Check that you can check-off a task", IsCompleted = false };
repository.Add(todoItem);
// Act
// Modify the task and update the repository
todoItem.IsCompleted = true;
repository.Update(todoItem);
// Retrieve the updated task from the repository
var updatedTask = repository.GetById(todoItem.Id);
// Assert
Assert.IsNotNull(updatedTask);
Assert.That(updatedTask.IsCompleted, Is.EqualTo(true));
// Ensure the task name itself is not modified
Assert.That(updatedTask.Task, Is.EqualTo("Check that you can check-off a task"));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment