From f3c7912caec2e9eee8a685d8751894f357528a71 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 19 Nov 2019 23:18:45 +0800 Subject: Complete integrated tests??? Fix bugs. --- Timeline.Tests/Mock/Data/TestDatabase.cs | 70 ++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 12 deletions(-) (limited to 'Timeline.Tests/Mock/Data/TestDatabase.cs') diff --git a/Timeline.Tests/Mock/Data/TestDatabase.cs b/Timeline.Tests/Mock/Data/TestDatabase.cs index 1e662546..1f396177 100644 --- a/Timeline.Tests/Mock/Data/TestDatabase.cs +++ b/Timeline.Tests/Mock/Data/TestDatabase.cs @@ -1,42 +1,88 @@ using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using System; +using System.Collections.Generic; +using System.Linq; using Timeline.Entities; +using Timeline.Models; +using Timeline.Services; namespace Timeline.Tests.Mock.Data { public class TestDatabase : IDisposable { - public static void InitDatabase(DatabaseContext context) + // currently password service is thread safe, so we share a static one. + private static PasswordService PasswordService { get; } = new PasswordService(); + + private static User CreateEntityFromMock(MockUser user) + { + return new User + { + Name = user.Username, + EncryptedPassword = PasswordService.HashPassword(user.Password), + RoleString = UserRoleConvert.ToString(user.Administrator), + Avatar = null + }; + } + + private static IEnumerable CreateDefaultMockEntities() + { + // emmmmmmm. Never reuse the user instances because EF Core uses them, which will cause strange things. + yield return CreateEntityFromMock(MockUser.User); + yield return CreateEntityFromMock(MockUser.Admin); + } + + private static void InitDatabase(DatabaseContext context) { context.Database.EnsureCreated(); - context.Users.AddRange(MockUser.CreateMockEntities()); + context.Users.AddRange(CreateDefaultMockEntities()); context.SaveChanges(); } public TestDatabase() { - DatabaseConnection = new SqliteConnection("Data Source=:memory:;"); - DatabaseConnection.Open(); + Connection = new SqliteConnection("Data Source=:memory:;"); + Connection.Open(); var options = new DbContextOptionsBuilder() - .UseSqlite(DatabaseConnection) + .UseSqlite(Connection) .Options; - DatabaseContext = new DatabaseContext(options); + Context = new DatabaseContext(options); + + InitDatabase(Context); + } + + private List _extraMockUsers; + + public IReadOnlyList ExtraMockUsers => _extraMockUsers; + + public void CreateExtraMockUsers(int count) + { + if (count <= 0) + throw new ArgumentOutOfRangeException(nameof(count), count, "Additional user count must be bigger than 0."); + if (_extraMockUsers != null) + throw new InvalidOperationException("Already create mock users."); + + _extraMockUsers = new List(); + for (int i = 0; i < count; i++) + { + _extraMockUsers.Add(new MockUser($"user{i}", $"password", false)); + } - InitDatabase(DatabaseContext); + Context.AddRange(_extraMockUsers.Select(u => CreateEntityFromMock(u))); + Context.SaveChanges(); } public void Dispose() { - DatabaseContext.Dispose(); + Context.Dispose(); - DatabaseConnection.Close(); - DatabaseConnection.Dispose(); + Connection.Close(); + Connection.Dispose(); } - public SqliteConnection DatabaseConnection { get; } - public DatabaseContext DatabaseContext { get; } + public SqliteConnection Connection { get; } + public DatabaseContext Context { get; } } } -- cgit v1.2.3