From f72a8d7f3415b510231a6ec60e020b1dde358059 Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Mon, 19 Aug 2019 15:43:47 +0800 Subject: Add avatar 304. --- Timeline.Tests/DatabaseTest.cs | 37 +++++++++++++++++++++ Timeline.Tests/Helpers/MyWebApplicationFactory.cs | 4 +-- Timeline.Tests/IntegratedTests/UserAvatarTests.cs | 12 +++++++ Timeline.Tests/Mock/Data/TestDatabase.cs | 12 ++++--- Timeline.Tests/Mock/Data/TestUsers.cs | 40 ++++++++++++----------- Timeline.Tests/UserAvatarServiceTest.cs | 17 ++++++---- 6 files changed, 90 insertions(+), 32 deletions(-) create mode 100644 Timeline.Tests/DatabaseTest.cs (limited to 'Timeline.Tests') diff --git a/Timeline.Tests/DatabaseTest.cs b/Timeline.Tests/DatabaseTest.cs new file mode 100644 index 00000000..e280637c --- /dev/null +++ b/Timeline.Tests/DatabaseTest.cs @@ -0,0 +1,37 @@ +using FluentAssertions; +using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using Timeline.Entities; +using Timeline.Tests.Mock.Data; +using Xunit; + +namespace Timeline.Tests +{ + public class DatabaseTest : IDisposable + { + private readonly TestDatabase _database; + private readonly DatabaseContext _context; + + public DatabaseTest() + { + _database = new TestDatabase(); + _context = _database.DatabaseContext; + } + + public void Dispose() + { + _database.Dispose(); + } + + [Fact] + public void DeleteUserShouldAlsoDeleteAvatar() + { + _context.UserAvatars.Count().Should().Be(2); + var user = _context.Users.First(); + _context.Users.Remove(user); + _context.SaveChanges(); + _context.UserAvatars.Count().Should().Be(1); + } + } +} diff --git a/Timeline.Tests/Helpers/MyWebApplicationFactory.cs b/Timeline.Tests/Helpers/MyWebApplicationFactory.cs index e96d11fe..1a9fe01e 100644 --- a/Timeline.Tests/Helpers/MyWebApplicationFactory.cs +++ b/Timeline.Tests/Helpers/MyWebApplicationFactory.cs @@ -46,9 +46,7 @@ namespace Timeline.Tests.Helpers using (var context = new DatabaseContext(options)) { - context.Database.EnsureCreated(); - context.Users.AddRange(MockUsers.Users); - context.SaveChanges(); + TestDatabase.InitDatabase(context); }; } diff --git a/Timeline.Tests/IntegratedTests/UserAvatarTests.cs b/Timeline.Tests/IntegratedTests/UserAvatarTests.cs index efe63346..794f251b 100644 --- a/Timeline.Tests/IntegratedTests/UserAvatarTests.cs +++ b/Timeline.Tests/IntegratedTests/UserAvatarTests.cs @@ -6,6 +6,7 @@ using SixLabors.ImageSharp.Formats.Png; using System; using System.IO; using System.Net; +using System.Net.Http; using System.Threading.Tasks; using Timeline.Controllers; using Timeline.Services; @@ -63,6 +64,17 @@ namespace Timeline.Tests.IntegratedTests await GetReturnDefault(); await GetReturnDefault("admin"); + { + var request = new HttpRequestMessage() + { + RequestUri = new Uri(client.BaseAddress, "users/user/avatar"), + Method = HttpMethod.Get, + }; + request.Headers.Add("If-Modified-Since", DateTime.Now.ToString("r")); + var res = await client.SendAsync(request); + res.Should().HaveStatusCode(HttpStatusCode.NotModified); + } + { var res = await client.PutByteArrayAsync("users/user/avatar", new[] { (byte)0x00 }, "image/notaccept"); res.Should().HaveStatusCode(HttpStatusCode.UnsupportedMediaType); diff --git a/Timeline.Tests/Mock/Data/TestDatabase.cs b/Timeline.Tests/Mock/Data/TestDatabase.cs index 09c77dce..7b4bc65e 100644 --- a/Timeline.Tests/Mock/Data/TestDatabase.cs +++ b/Timeline.Tests/Mock/Data/TestDatabase.cs @@ -8,6 +8,13 @@ namespace Timeline.Tests.Mock.Data { public class TestDatabase : IDisposable { + public static void InitDatabase(DatabaseContext context) + { + context.Database.EnsureCreated(); + context.Users.AddRange(MockUsers.CreateMockUsers()); + context.SaveChanges(); + } + private readonly SqliteConnection _databaseConnection; private readonly DatabaseContext _databaseContext; @@ -26,10 +33,7 @@ namespace Timeline.Tests.Mock.Data _databaseContext = new DatabaseContext(options); - // init with mock data - _databaseContext.Database.EnsureCreated(); - _databaseContext.Users.AddRange(MockUsers.Users); - _databaseContext.SaveChanges(); + InitDatabase(_databaseContext); } public void Dispose() diff --git a/Timeline.Tests/Mock/Data/TestUsers.cs b/Timeline.Tests/Mock/Data/TestUsers.cs index f34f62c5..378fc280 100644 --- a/Timeline.Tests/Mock/Data/TestUsers.cs +++ b/Timeline.Tests/Mock/Data/TestUsers.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using Timeline.Entities; @@ -10,38 +11,39 @@ namespace Timeline.Tests.Mock.Data { static MockUsers() { - var mockUsers = new List(); - var passwordService = new PasswordService(); + var mockUserInfos = CreateMockUsers().Select(u => UserUtility.CreateUserInfo(u)).ToList(); + UserUserInfo = mockUserInfos[0]; + AdminUserInfo = mockUserInfos[1]; + UserInfos = mockUserInfos; + } - mockUsers.Add(new User + public const string UserUsername = "user"; + public const string AdminUsername = "admin"; + public const string UserPassword = "user"; + public const string AdminPassword = "admin"; + + // emmmmmmm. Never reuse the user instances because EF Core uses them which will cause strange things. + internal static IEnumerable CreateMockUsers() + { + var users = new List(); + var passwordService = new PasswordService(); + users.Add(new User { Name = UserUsername, EncryptedPassword = passwordService.HashPassword(UserPassword), RoleString = UserUtility.IsAdminToRoleString(false), - Version = 0, + Avatar = UserAvatar.Create(DateTime.Now) }); - mockUsers.Add(new User + users.Add(new User { Name = AdminUsername, EncryptedPassword = passwordService.HashPassword(AdminPassword), RoleString = UserUtility.IsAdminToRoleString(true), - Version = 0, + Avatar = UserAvatar.Create(DateTime.Now) }); - - Users = mockUsers; - - var mockUserInfos = mockUsers.Select(u => UserUtility.CreateUserInfo(u)).ToList(); - UserUserInfo = mockUserInfos[0]; - AdminUserInfo = mockUserInfos[1]; - UserInfos = mockUserInfos; + return users; } - public const string UserUsername = "user"; - public const string AdminUsername = "admin"; - public const string UserPassword = "user"; - public const string AdminPassword = "admin"; - - internal static IReadOnlyList Users { get; } public static IReadOnlyList UserInfos { get; } public static UserInfo AdminUserInfo { get; } diff --git a/Timeline.Tests/UserAvatarServiceTest.cs b/Timeline.Tests/UserAvatarServiceTest.cs index 03b64a6b..f11da4f0 100644 --- a/Timeline.Tests/UserAvatarServiceTest.cs +++ b/Timeline.Tests/UserAvatarServiceTest.cs @@ -17,11 +17,15 @@ namespace Timeline.Tests { public class MockDefaultUserAvatarProvider : IDefaultUserAvatarProvider { - public static Avatar Avatar { get; } = new Avatar { Type = "image/test", Data = Encoding.ASCII.GetBytes("test") }; + public static AvatarInfo AvatarInfo { get; } = new AvatarInfo + { + Avatar = new Avatar { Type = "image/test", Data = Encoding.ASCII.GetBytes("test") }, + LastModified = DateTime.Now + }; - public Task GetDefaultAvatar() + public Task GetDefaultAvatar() { - return Task.FromResult(Avatar); + return Task.FromResult(AvatarInfo); } } @@ -153,7 +157,7 @@ namespace Timeline.Tests public async Task GetAvatar_ShouldReturn_Default() { const string username = MockUsers.UserUsername; - (await _service.GetAvatar(username)).Should().BeEquivalentTo(await _mockDefaultUserAvatarProvider.GetDefaultAvatar()); + (await _service.GetAvatar(username)).Avatar.Should().BeEquivalentTo((await _mockDefaultUserAvatarProvider.GetDefaultAvatar()).Avatar); } [Fact] @@ -173,7 +177,7 @@ namespace Timeline.Tests await context.SaveChangesAsync(); } - (await _service.GetAvatar(username)).Should().BeEquivalentTo(MockAvatar); + (await _service.GetAvatar(username)).Avatar.Should().BeEquivalentTo(MockAvatar); } [Fact] @@ -223,7 +227,8 @@ namespace Timeline.Tests // delete await _service.SetAvatar(username, null); - user.Avatar.Should().BeNull(); + user.Avatar.Type.Should().BeNull(); + user.Avatar.Data.Should().BeNull(); } } } -- cgit v1.2.3