diff --git a/ComiServUnitTest/AuthenticationServiceTests.cs b/ComiServUnitTest/AuthenticationServiceTests.cs
new file mode 100644
index 0000000..7274b2c
--- /dev/null
+++ b/ComiServUnitTest/AuthenticationServiceTests.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ComiServ.Entities;
+using ComiServ.Services;
+
+namespace ComiServUnitTest;
+
+[TestClass]
+public class AuthenticationServiceTests
+{
+ [TestMethod]
+ public void FailAuth()
+ {
+ IAuthenticationService auth = new AuthenticationService();
+ Assert.IsFalse(auth.Tested);
+ auth.FailAuth();
+ Assert.IsTrue(auth.Tested);
+ Assert.IsNull(auth.User);
+ }
+ [TestMethod]
+ public void AuthenticateUser()
+ {
+ IAuthenticationService auth = new AuthenticationService();
+ User user = new()
+ {
+ Username = "NewUser",
+ UserTypeId = UserTypeEnum.User,
+ };
+ Assert.IsFalse(auth.Tested);
+ auth.Authenticate(user);
+ Assert.IsTrue(auth.Tested);
+ Assert.IsNotNull(auth.User);
+ Assert.AreSame(user, auth.User);
+ }
+}
diff --git a/ComiServUnitTest/ComiServUnitTest.csproj b/ComiServUnitTest/ComiServUnitTest.csproj
new file mode 100644
index 0000000..beae4d9
--- /dev/null
+++ b/ComiServUnitTest/ComiServUnitTest.csproj
@@ -0,0 +1,28 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ComiServUnitTest/PaginatedTests.cs b/ComiServUnitTest/PaginatedTests.cs
new file mode 100644
index 0000000..d04a911
--- /dev/null
+++ b/ComiServUnitTest/PaginatedTests.cs
@@ -0,0 +1,87 @@
+using ComiServ.Models;
+using Microsoft.EntityFrameworkCore.Metadata.Conventions;
+using System.CodeDom;
+using System.Security.Policy;
+
+namespace ComiServUnitTest;
+
+[TestClass]
+public class PaginatedTests
+{
+ [TestMethod]
+ public void PageUnderUnderflow()
+ {
+ const int pageNum = 1;
+ const int pageSize = 20;
+ const int dataSize = 30;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var page = new Paginated(pageSize, pageNum, data);
+ Assert.IsTrue(page.Last);
+ Assert.AreEqual(pageSize, page.Max);
+ Assert.AreEqual(pageNum, page.Page);
+ Assert.AreEqual(10, page.Count);
+ Assert.AreEqual(page.Items.Count, page.Count);
+ Assert.AreEqual(20, page.Items.First());
+ Assert.AreEqual(data.Last(), page.Items.Last());
+ }
+ [TestMethod]
+ public void PageOverflow()
+ {
+ const int pageNum = 2;
+ const int pageSize = 30;
+ const int dataSize = 150;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var page = new Paginated(pageSize, pageNum, data);
+ Assert.IsFalse(page.Last);
+ Assert.AreEqual(pageSize, page.Max);
+ Assert.AreEqual(pageNum, page.Page);
+ Assert.AreEqual(pageSize, page.Count);
+ Assert.AreEqual(page.Items.Count, page.Count);
+ Assert.AreEqual(pageSize*pageNum, page.Items.First());
+ Assert.AreEqual(pageSize*(pageNum+1)-1, page.Items.Last());
+ }
+ [TestMethod]
+ public void PageExact()
+ {
+ const int pageNum = 1;
+ const int pageSize = 30;
+ const int dataSize = 60;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var page = new Paginated(pageSize, pageNum, data);
+ Assert.IsTrue(page.Last);
+ Assert.AreEqual(pageSize, page.Max);
+ Assert.AreEqual(pageNum, page.Page);
+ Assert.AreEqual(pageSize, page.Count);
+ Assert.AreEqual(page.Items.Count, page.Count);
+ Assert.AreEqual(pageSize * pageNum, page.Items.First());
+ Assert.AreEqual(data.Last(), page.Items.Last());
+ }
+ [TestMethod]
+ public void PageEmpty()
+ {
+ const int pageNum = 0;
+ const int pageSize = 10;
+ const int dataSize = 0;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var page = new Paginated(pageSize, pageNum, data);
+ Assert.IsTrue(page.Last);
+ Assert.AreEqual(pageSize, page.Max);
+ Assert.AreEqual(pageNum, page.Page);
+ Assert.AreEqual(page.Items.Count, page.Count);
+ Assert.IsFalse(page.Items.Any());
+ }
+ [TestMethod]
+ public void PageDoesntExist()
+ {
+ const int pageNum = 5;
+ const int pageSize = 20;
+ const int dataSize = 50;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var page = new Paginated(pageSize, pageNum, data);
+ Assert.IsTrue(page.Last);
+ Assert.AreEqual(pageSize, page.Max);
+ Assert.AreEqual(pageNum, page.Page);
+ Assert.AreEqual(page.Items.Count, page.Count);
+ Assert.IsFalse(page.Items.Any());
+ }
+}
\ No newline at end of file
diff --git a/ComiServUnitTest/TruncatedTests.cs b/ComiServUnitTest/TruncatedTests.cs
new file mode 100644
index 0000000..8926f6e
--- /dev/null
+++ b/ComiServUnitTest/TruncatedTests.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ComiServ.Models;
+
+namespace ComiServUnitTest;
+
+[TestClass]
+public class TruncatedTests
+{
+ [TestMethod]
+ public void TruncationUnderflow()
+ {
+ const int truncMax = 20;
+ const int dataSize = 10;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var trunc = new Truncated(truncMax, data);
+ Assert.IsTrue(trunc.Complete);
+ Assert.AreEqual(truncMax, trunc.Max);
+ Assert.AreEqual(dataSize, trunc.Count);
+ Assert.AreEqual(trunc.Items.Count, trunc.Count);
+ Assert.AreEqual(data.First(), trunc.Items.First());
+ Assert.AreEqual(data.Last(), trunc.Items.Last());
+ }
+ [TestMethod]
+ public void TruncationOverflow()
+ {
+ const int truncMax = 20;
+ const int dataSize = 30;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var trunc = new Truncated(truncMax, data);
+ Assert.IsFalse(trunc.Complete);
+ Assert.AreEqual(truncMax, trunc.Max);
+ Assert.AreEqual(truncMax, trunc.Count);
+ Assert.AreEqual(trunc.Items.Count, trunc.Count);
+ Assert.AreEqual(data.First(), trunc.Items.First());
+ Assert.AreEqual(truncMax - 1, trunc.Items.Last());
+ }
+ [TestMethod]
+ public void TruncationExact()
+ {
+ const int truncMax = 5;
+ const int dataSize = 5;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var trunc = new Truncated(truncMax, data);
+ Assert.IsTrue(trunc.Complete);
+ Assert.AreEqual(truncMax, trunc.Max);
+ Assert.AreEqual(truncMax, trunc.Count);
+ Assert.AreEqual(trunc.Items.Count, trunc.Count);
+ Assert.AreEqual(data.First(), trunc.Items.First());
+ Assert.AreEqual(data.Last(), trunc.Items.Last());
+ }
+ [TestMethod]
+ public void TruncationEmpty()
+ {
+ const int truncMax = 5;
+ const int dataSize = 0;
+ var data = Enumerable.Range(0, dataSize).ToArray();
+ var trunc = new Truncated(truncMax, data);
+ Assert.IsTrue(trunc.Complete);
+ Assert.AreEqual(truncMax, trunc.Max);
+ Assert.AreEqual(0, trunc.Count);
+ Assert.AreEqual(trunc.Items.Count, trunc.Count);
+ }
+}