diff options
Diffstat (limited to 'Timeline.Tests/Mock')
| -rw-r--r-- | Timeline.Tests/Mock/Data/TestDatabase.cs | 70 | ||||
| -rw-r--r-- | Timeline.Tests/Mock/Data/TestUsers.cs | 25 | 
2 files changed, 58 insertions, 37 deletions
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<User> 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<DatabaseContext>()
 -                .UseSqlite(DatabaseConnection)
 +                .UseSqlite(Connection)
                  .Options;
 -            DatabaseContext = new DatabaseContext(options);
 +            Context = new DatabaseContext(options);
 +
 +            InitDatabase(Context);
 +        }
 +
 +        private List<MockUser> _extraMockUsers;
 +
 +        public IReadOnlyList<MockUser> 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<MockUser>();
 +            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; }
      }
  }
 diff --git a/Timeline.Tests/Mock/Data/TestUsers.cs b/Timeline.Tests/Mock/Data/TestUsers.cs index fa75236a..443d3cf9 100644 --- a/Timeline.Tests/Mock/Data/TestUsers.cs +++ b/Timeline.Tests/Mock/Data/TestUsers.cs @@ -1,8 +1,5 @@ -using System;
  using System.Collections.Generic;
 -using Timeline.Entities;
  using Timeline.Models;
 -using Timeline.Services;
  namespace Timeline.Tests.Mock.Data
  {
 @@ -24,27 +21,5 @@ namespace Timeline.Tests.Mock.Data          public static MockUser Admin { get; } = new MockUser("admin", "adminpassword", true);
          public static IReadOnlyList<UserInfo> UserInfoList { get; } = new List<UserInfo> { User.Info, Admin.Info };
 -
 -        // emmmmmmm. Never reuse the user instances because EF Core uses them, which will cause strange things.
 -        public static IEnumerable<User> CreateMockEntities()
 -        {
 -            var passwordService = new PasswordService();
 -            User Create(MockUser user)
 -            {
 -                return new User
 -                {
 -                    Name = user.Username,
 -                    EncryptedPassword = passwordService.HashPassword(user.Password),
 -                    RoleString = UserRoleConvert.ToString(user.Administrator),
 -                    Avatar = null
 -                };
 -            }
 -
 -            return new List<User>
 -            {
 -                Create(User),
 -                Create(Admin)
 -            };
 -        }
      }
  }
  | 
