Add some service unit tests; add base for Fluxor tests
This commit is contained in:
		
							parent
							
								
									4e2b4d3806
								
							
						
					
					
						commit
						96553c3e2b
					
				
							
								
								
									
										29
									
								
								Start_Tests/Client/MockApis/MockBookmarkContainersApi.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Start_Tests/Client/MockApis/MockBookmarkContainersApi.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Net.Http;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Refit;
 | 
			
		||||
using Start.Shared;
 | 
			
		||||
using Start.Shared.Api;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests.Client.MockApis {
 | 
			
		||||
	public class MockBookmarkContainersApi : IBookmarkContainersApi {
 | 
			
		||||
		public Task<ApiResponse<IEnumerable<BookmarkContainerDto>>> GetAllBookmarkContainers() {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<ApiResponse<BookmarkContainerDto>> GetBookmarkContainer(
 | 
			
		||||
			int bookmarkContainerId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<ApiResponse<BookmarkContainerDto>> CreateBookmarkContainer(string title,
 | 
			
		||||
			int sortOrder) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<HttpResponseMessage> DeleteBookmarkContainer(int bookmarkContainerId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								Start_Tests/Client/MockApis/MockBookmarkGroupsApi.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Start_Tests/Client/MockApis/MockBookmarkGroupsApi.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Net.Http;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Refit;
 | 
			
		||||
using Start.Shared;
 | 
			
		||||
using Start.Shared.Api;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests.Client.MockApis {
 | 
			
		||||
	public class MockBookmarkGroupsApi : IBookmarkGroupsApi {
 | 
			
		||||
		public Task<ApiResponse<BookmarkGroupDto>> GetBookmarkGroup(int bookmarkGroupId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<ApiResponse<BookmarkGroupDto>> CreateBookmarkGroup(string title, string color,
 | 
			
		||||
			int sortOrder, int bookmarkContainerId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<HttpResponseMessage> DeleteBookmarkGroup(int bookmarkGroupId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								Start_Tests/Client/MockApis/MockBookmarksApi.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Start_Tests/Client/MockApis/MockBookmarksApi.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Net.Http;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Refit;
 | 
			
		||||
using Start.Shared;
 | 
			
		||||
using Start.Shared.Api;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests.Client.MockApis {
 | 
			
		||||
	public class MockBookmarksApi : IBookmarksApi {
 | 
			
		||||
		public Task<ApiResponse<BookmarkDto>> GetBookmark(int bookmarkId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<ApiResponse<BookmarkDto>> CreateBookmark(string title, string url,
 | 
			
		||||
			string notes, int sortOrder, int bookmarkGroupId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Task<HttpResponseMessage> DeleteBookmark(int bookmarkId) {
 | 
			
		||||
			throw new NotImplementedException();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								Start_Tests/Client/Store/ContainerListTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Start_Tests/Client/Store/ContainerListTests.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
			
		||||
 | 
			
		||||
using Start.Client.Store.Features.ContainersList;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests.Client.Store {
 | 
			
		||||
	[TestClass]
 | 
			
		||||
	public class ContainerListTests : UnitTestWithFluxor {
 | 
			
		||||
		public TestContext TestContext { get; set; }
 | 
			
		||||
		// Only RootState is needed, so no need to get child objects
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public void OnFetchContainersList() {
 | 
			
		||||
			base.Store.Dispatch(new FetchContainerListAction());
 | 
			
		||||
 | 
			
		||||
			Assert.IsTrue(base.State.Value.ContainerListState.IsLoadingContainersList);
 | 
			
		||||
			Assert.AreEqual(0, this.State.Value.ContainerListState.Containers.Count);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestInitialize]
 | 
			
		||||
		public void InitializeState() {
 | 
			
		||||
			TestContext.WriteLine("Resetting Fluxor state");
 | 
			
		||||
			base.ResetState();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								Start_Tests/Client/Store/UnitTestWithFluxor.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Start_Tests/Client/Store/UnitTestWithFluxor.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
using System;
 | 
			
		||||
using Blazored.LocalStorage;
 | 
			
		||||
using Fluxor;
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using Start.Client.Store.State;
 | 
			
		||||
using Start.Shared.Api;
 | 
			
		||||
using Start_Tests.Client.MockApis;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests.Client.Store {
 | 
			
		||||
	public abstract class UnitTestWithFluxor {
 | 
			
		||||
		protected IServiceProvider ServiceProvider { get; set; }
 | 
			
		||||
		protected IStore Store { get; set; }
 | 
			
		||||
		protected IState<RootState> State { get; set; }
 | 
			
		||||
		// Add child states in the individual tests
 | 
			
		||||
 | 
			
		||||
		protected Bunit.TestContext BunitTc { get; set; }
 | 
			
		||||
 | 
			
		||||
		public UnitTestWithFluxor() {
 | 
			
		||||
			this.ResetState();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void ResetState() {
 | 
			
		||||
			this.BunitTc = new Bunit.TestContext();
 | 
			
		||||
 | 
			
		||||
			BunitTc.Services.AddBlazoredLocalStorage();
 | 
			
		||||
			BunitTc.Services.AddFluxor(config => config.ScanAssemblies(typeof(RootState).Assembly));
 | 
			
		||||
			BunitTc.Services.AddScoped<IBookmarksApi>(sp => new MockBookmarksApi());
 | 
			
		||||
			BunitTc.Services.AddScoped<IBookmarkGroupsApi>(sp => new MockBookmarkGroupsApi());
 | 
			
		||||
			BunitTc.Services
 | 
			
		||||
				.AddScoped<IBookmarkContainersApi>(sp => new MockBookmarkContainersApi());
 | 
			
		||||
 | 
			
		||||
			this.Store = this.BunitTc.Services.GetRequiredService<IStore>();
 | 
			
		||||
			this.State = this.BunitTc.Services.GetRequiredService<IState<RootState>>();
 | 
			
		||||
			this.Store.InitializeAsync().Wait();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										117
									
								
								Start_Tests/Server/BookmarkServiceTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								Start_Tests/Server/BookmarkServiceTests.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,117 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
			
		||||
using Start.Server.Data.Services;
 | 
			
		||||
using Start.Server.Models;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests.Server {
 | 
			
		||||
	[TestClass]
 | 
			
		||||
	public class BookmarkServiceTests : UnitTestWithDb {
 | 
			
		||||
		public TestContext TestContext { get; set; }
 | 
			
		||||
		public BookmarkService BookmarkService { get; set; }
 | 
			
		||||
 | 
			
		||||
		public BookmarkServiceTests() {
 | 
			
		||||
			this.BookmarkService = new BookmarkService(_db);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public override void TestDatabaseOK() {
 | 
			
		||||
			base.TestDatabaseOK();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		#region CreateBookmark
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public async Task CreateBookmark_Valid() {
 | 
			
		||||
			int initialCount = _db.Bookmarks.Count();
 | 
			
		||||
 | 
			
		||||
			await this.BookmarkService.CreateBookmark(base.TestUserId,
 | 
			
		||||
				"Bookmark Service Test Title", "http://example.com", null, 1,
 | 
			
		||||
				this.TestBookmarkGroup.BookmarkGroupId);
 | 
			
		||||
 | 
			
		||||
			int updatedCount = _db.Bookmarks.Count();
 | 
			
		||||
			Assert.AreEqual(initialCount + 1, updatedCount);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		[ExpectedException(typeof(DbUpdateException))]
 | 
			
		||||
		public async Task CreateBookmark_InvalidTitle() {
 | 
			
		||||
			await this.BookmarkService.CreateBookmark(base.TestUserId,
 | 
			
		||||
				null, "http://example.com", null, 1,
 | 
			
		||||
				this.TestBookmarkGroup.BookmarkGroupId);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		[ExpectedException(typeof(DbUpdateException))]
 | 
			
		||||
		public async Task CreateBookmark_InvalidUrl() {
 | 
			
		||||
			await this.BookmarkService.CreateBookmark(base.TestUserId,
 | 
			
		||||
				"Bookmark Service Test Title", null, null, 1,
 | 
			
		||||
				this.TestBookmarkGroup.BookmarkGroupId);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		#endregion
 | 
			
		||||
 | 
			
		||||
		#region GetBookmark
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public async Task GetBookmark_CorrectUser() {
 | 
			
		||||
			Bookmark bookmark = await this.BookmarkService
 | 
			
		||||
				.GetBookmark(base.TestUserId,base.TestBookmark.BookmarkId);
 | 
			
		||||
 | 
			
		||||
			Assert.IsNotNull(bookmark);
 | 
			
		||||
			Assert.AreEqual(bookmark.BookmarkId, base.TestBookmark.BookmarkId);
 | 
			
		||||
			Assert.AreEqual(bookmark.Url, base.TestBookmark.Url);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public async Task GetBookmark_WrongUser() {
 | 
			
		||||
			Bookmark bookmark = await this.BookmarkService
 | 
			
		||||
				.GetBookmark(base.InvalidUserId, base.TestBookmark.BookmarkId);
 | 
			
		||||
 | 
			
		||||
			// Should return null if the user doesn't own the bookmark
 | 
			
		||||
			Assert.IsNull(bookmark);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public async Task GetBookmark_WrongId() {
 | 
			
		||||
			// Ensure that we use an invalid ID by going past the highest ID value
 | 
			
		||||
 | 
			
		||||
			int maxBookmarkId = _db.Bookmarks.Max(b => b.BookmarkId);
 | 
			
		||||
 | 
			
		||||
			Bookmark bookmark = await this.BookmarkService
 | 
			
		||||
				.GetBookmark(base.TestUserId, maxBookmarkId + 1);
 | 
			
		||||
 | 
			
		||||
			Assert.IsNull(bookmark);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		#endregion
 | 
			
		||||
 | 
			
		||||
		#region UpdateBookmark
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public async Task UpdateBookmark_ValidTitle() {
 | 
			
		||||
			string testTitleUpdate = "Update bookkmark test title";
 | 
			
		||||
 | 
			
		||||
			base.TestBookmark.Title = testTitleUpdate;
 | 
			
		||||
			Bookmark updatedBookmark = await this.BookmarkService
 | 
			
		||||
				.UpdateBookmark(base.TestUserId, base.TestBookmark);
 | 
			
		||||
 | 
			
		||||
			Assert.IsNotNull(updatedBookmark);
 | 
			
		||||
			Assert.AreEqual(updatedBookmark.Title, testTitleUpdate);
 | 
			
		||||
 | 
			
		||||
			Bookmark fromDb = _db.Bookmarks.Single(b => b.BookmarkId == TestBookmark.BookmarkId);
 | 
			
		||||
 | 
			
		||||
			Assert.AreEqual(fromDb.Title, testTitleUpdate);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		#endregion
 | 
			
		||||
 | 
			
		||||
		[TestInitialize]
 | 
			
		||||
		public void ResetDatabase() {
 | 
			
		||||
			TestContext.WriteLine("Reseting test DB for the next test");
 | 
			
		||||
			base.ResetAndFillDb();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -7,11 +7,17 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
			
		|||
using Start.Server.Data;
 | 
			
		||||
using Start.Server.Models;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests {
 | 
			
		||||
namespace Start_Tests.Server {
 | 
			
		||||
	public class UnitTestWithDb : IDisposable {
 | 
			
		||||
		private const string InMemoryConnectionString = "DataSource=:memory:";
 | 
			
		||||
		private SqliteConnection _connection;
 | 
			
		||||
 | 
			
		||||
		protected string TestUserId { get; } = "test_user";
 | 
			
		||||
		protected string InvalidUserId { get; } = "invalid_user";
 | 
			
		||||
		protected BookmarkContainer TestBookmarkContainer { get; set; }
 | 
			
		||||
		protected BookmarkGroup TestBookmarkGroup { get; set; }
 | 
			
		||||
		protected Bookmark TestBookmark { get; set; }
 | 
			
		||||
 | 
			
		||||
		protected readonly ApplicationDbContext _db;
 | 
			
		||||
 | 
			
		||||
		public UnitTestWithDb() {
 | 
			
		||||
| 
						 | 
				
			
			@ -34,8 +40,8 @@ namespace Start_Tests {
 | 
			
		|||
 | 
			
		||||
		protected void FillDbTestData() {
 | 
			
		||||
			ApplicationUser testUser = new ApplicationUser {
 | 
			
		||||
				Id = "test_user",
 | 
			
		||||
				UserName = "test_user"
 | 
			
		||||
				Id = this.TestUserId,
 | 
			
		||||
				UserName = "test_user_name"
 | 
			
		||||
			};
 | 
			
		||||
			_db.Users.Add(testUser);
 | 
			
		||||
			_db.SaveChanges();
 | 
			
		||||
| 
						 | 
				
			
			@ -44,16 +50,24 @@ namespace Start_Tests {
 | 
			
		|||
				0);
 | 
			
		||||
			_db.BookmarkContainers.Add(testContainer);
 | 
			
		||||
			_db.SaveChanges();
 | 
			
		||||
			this.TestBookmarkContainer = testContainer;
 | 
			
		||||
 | 
			
		||||
			BookmarkGroup testGroup = new BookmarkGroup("Test Group", "#000000", 0,
 | 
			
		||||
				testContainer.BookmarkContainerId);
 | 
			
		||||
			_db.BookmarkGroups.Add(testGroup);
 | 
			
		||||
			_db.SaveChanges();
 | 
			
		||||
			this.TestBookmarkGroup = testGroup;
 | 
			
		||||
 | 
			
		||||
			Bookmark testBookmark = new Bookmark("Test Bookmark", "http://example.com",
 | 
			
		||||
				"Test Notes", 0, testGroup.BookmarkGroupId);
 | 
			
		||||
			_db.Bookmarks.Add(testBookmark);
 | 
			
		||||
			_db.SaveChanges();
 | 
			
		||||
			this.TestBookmark = testBookmark;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected void ResetAndFillDb() {
 | 
			
		||||
			this.ResetDb();
 | 
			
		||||
			this.FillDbTestData();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -11,10 +11,28 @@
 | 
			
		|||
    <PackageReference Include="MSTest.TestAdapter" Version="2.2.3" />
 | 
			
		||||
    <PackageReference Include="MSTest.TestFramework" Version="2.2.3" />
 | 
			
		||||
    <PackageReference Include="coverlet.collector" Version="3.0.2" />
 | 
			
		||||
    <PackageReference Include="Fluxor" Version="4.2.1" />
 | 
			
		||||
    <PackageReference Include="Blazored.LocalStorage" Version="4.1.5" />
 | 
			
		||||
    <PackageReference Include="bunit" Version="1.6.4" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\Start\Server\Start.Server.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\Start\Shared\Start.Shared.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <None Remove="Server\" />
 | 
			
		||||
    <None Remove="Client\" />
 | 
			
		||||
    <None Remove="Client\Store\" />
 | 
			
		||||
    <None Remove="Fluxor" />
 | 
			
		||||
    <None Remove="Blazored.LocalStorage" />
 | 
			
		||||
    <None Remove="bunit" />
 | 
			
		||||
    <None Remove="Client\MockServices\" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Folder Include="Server\" />
 | 
			
		||||
    <Folder Include="Client\" />
 | 
			
		||||
    <Folder Include="Client\Store\" />
 | 
			
		||||
    <Folder Include="Client\MockApis\" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,20 +0,0 @@
 | 
			
		|||
using System;
 | 
			
		||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
			
		||||
using Start.Server.Models;
 | 
			
		||||
 | 
			
		||||
namespace Start_Tests {
 | 
			
		||||
	[TestClass]
 | 
			
		||||
	public class UnitTest1 : UnitTestWithDb {
 | 
			
		||||
		public TestContext TestContext { get; set; }
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public override void TestDatabaseOK() {
 | 
			
		||||
			base.TestDatabaseOK();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[TestMethod]
 | 
			
		||||
		public void TestMethod1() {
 | 
			
		||||
			TestContext.WriteLine("Running TestMethod1 from TestContext");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in a new issue