diff --git a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs index ad09e241c2..32a04350ee 100644 --- a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Net.Http.Formatting; using Moq; @@ -36,7 +37,11 @@ namespace Umbraco.Tests.Web.Controllers u.Id = 1234; }); userServiceMock.Setup(service => service.GetAllUserGroups(It.IsAny())) - .Returns(Enumerable.Empty); + .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); + userServiceMock.Setup(service => service.GetUserGroupsByAlias(It.IsAny())) + .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); + userServiceMock.Setup(service => service.GetUserById(It.IsAny())) + .Returns(new User(1234, "Test", "asdf@asdf.com", "test", "", new List(), new int[0], new int[0])); //we need to manually apply automapper mappings with the mocked applicationcontext InitializeMappers(helper.UmbracoContext.Application); @@ -44,30 +49,32 @@ namespace Umbraco.Tests.Web.Controllers return new UsersController(helper.UmbracoContext); }); - var invite = new UserInvite + var userSave = new UserSave { Id = -1, Email = "test@test.com", - Message = "Hello test!", + Username = "test@test.com", + Culture = "en", Name = "Test", UserGroups = new[] { "writers" } }; var response = await runner.Execute("Users", "PostSaveUser", HttpMethod.Post, - new ObjectContent(invite, new JsonMediaTypeFormatter())); + new ObjectContent(userSave, new JsonMediaTypeFormatter())); var obj = JsonConvert.DeserializeObject(response.Item2); - Assert.AreEqual(invite.Name, obj.Name); + Assert.AreEqual(userSave.Name, obj.Name); Assert.AreEqual(1234, obj.Id); - Assert.AreEqual(invite.Email, obj.Email); - foreach (var group in invite.UserGroups) + Assert.AreEqual(userSave.Email, obj.Email); + foreach (var group in userSave.UserGroups) { Assert.IsTrue(obj.UserGroups.Contains(group)); } } - [Test] - public async void Invite_User() + [TestCase("PostInviteUser")] + [TestCase("PostCreateUser")] + public async void Invite_And_Create(string action) { var runner = new TestRunner((message, helper) => { @@ -82,7 +89,9 @@ namespace Umbraco.Tests.Web.Controllers u.Id = 1234; }); userServiceMock.Setup(service => service.GetAllUserGroups(It.IsAny())) - .Returns(Enumerable.Empty); + .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); + userServiceMock.Setup(service => service.GetUserGroupsByAlias(It.IsAny())) + .Returns(new[]{Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers")}); //we need to manually apply automapper mappings with the mocked applicationcontext InitializeMappers(helper.UmbracoContext.Application); @@ -98,7 +107,7 @@ namespace Umbraco.Tests.Web.Controllers Name = "Test", UserGroups = new[] {"writers"} }; - var response = await runner.Execute("Users", "PostInviteUser", HttpMethod.Post, + var response = await runner.Execute("Users", action, HttpMethod.Post, new ObjectContent(invite, new JsonMediaTypeFormatter())); var obj = JsonConvert.DeserializeObject(response.Item2); diff --git a/src/Umbraco.Web.UI.Client/src/views/users/user.html b/src/Umbraco.Web.UI.Client/src/views/users/user.html index a20a985088..840dde1704 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/user.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/user.html @@ -160,8 +160,8 @@
Last login:
- {{ vm.user.lastLogin }} - The user has not logged in yet + {{ vm.user.lastLoginDate }} + The user has not logged in yet
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js index 81cb3737e5..3635521fea 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js @@ -285,8 +285,8 @@ function formatDates(users) { angular.forEach(users, function(user){ - if(user.lastLogin) { - user.formattedLastLogin = moment(user.lastLogin).format("MMMM Do YYYY, HH:mm"); + if (user.lastLoginDate) { + user.formattedLastLogin = moment(user.lastLoginDate).format("MMMM Do YYYY, HH:mm"); } }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html index 46432010dc..527f72666c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.html @@ -140,7 +140,7 @@ diff --git a/src/Umbraco.Web/Models/ContentEditing/UserDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/UserDisplay.cs index b9bea4bba3..f8706f9e97 100644 --- a/src/Umbraco.Web/Models/ContentEditing/UserDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/UserDisplay.cs @@ -29,7 +29,7 @@ namespace Umbraco.Web.Models.ContentEditing public string EmailHash { get; set; } [DataMember(Name = "lastLoginDate")] - public DateTime LastLoginDate { get; set; } + public DateTime? LastLoginDate { get; set; } /// /// Returns a list of different size avatars diff --git a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs index 339de9387e..bd940a9c57 100644 --- a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs @@ -94,6 +94,7 @@ namespace Umbraco.Web.Models.Mapping config.CreateMap() .ForMember(detail => detail.Avatars, opt => opt.MapFrom(user => user.GetCurrentUserAvatarUrls(applicationContext.Services.UserService, applicationContext.ApplicationCache.RuntimeCache))) .ForMember(detail => detail.Username, opt => opt.MapFrom(user => user.Username)) + .ForMember(detail => detail.LastLoginDate, opt => opt.MapFrom(user => user.LastLoginDate == default(DateTime) ? null : (DateTime?)user.LastLoginDate)) .ForMember(detail => detail.UserGroups, opt => opt.MapFrom(user => user.Groups.Select(x => x.Alias).ToArray())) .ForMember(detail => detail.StartContentIds, opt => opt.MapFrom(user => user.StartContentIds)) .ForMember(detail => detail.StartMediaIds, opt => opt.MapFrom(user => user.StartMediaIds))