using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Formatting; using System.Web.Http; using Moq; using Newtonsoft.Json; using NUnit.Framework; using Umbraco.Core.Composing; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.ControllerTesting; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.Testing; using Umbraco.Web; using Umbraco.Web.Editors; using Umbraco.Web.Models.ContentEditing; using IUser = Umbraco.Core.Models.Membership.IUser; namespace Umbraco.Tests.Web.Controllers { [TestFixture] [UmbracoTest(Database = UmbracoTestOptions.Database.None)] public class UsersControllerTests : TestWithDatabaseBase { protected override void ComposeApplication(bool withApplication) { base.ComposeApplication(withApplication); //if (!withApplication) return; // replace the true IUserService implementation with a mock // so that each test can configure the service to their liking Container.RegisterSingleton(f => Mock.Of()); // kill the true IEntityService too Container.RegisterSingleton(f => Mock.Of()); } [Test] public async System.Threading.Tasks.Task Save_User() { ApiController Factory(HttpRequestMessage message, UmbracoHelper helper) { //setup some mocks Umbraco.Core.Configuration.GlobalSettings.HasSmtpServer = true; var userServiceMock = Mock.Get(Current.Services.UserService); userServiceMock.Setup(service => service.Save(It.IsAny(), It.IsAny())) .Callback((IUser u, bool raiseEvents) => { u.Id = 1234; }); userServiceMock.Setup(service => service.GetAllUserGroups(It.IsAny())) .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((int id) => id == 1234 ? new User(1234, "Test", "test@test.com", "test@test.com", "", new List(), new int[0], new int[0]) : null); //we need to manually apply automapper mappings with the mocked applicationcontext //InitializeMappers(helper.UmbracoContext.Application); InitializeAutoMapper(true); var usersController = new UsersController(); Container.InjectProperties(usersController); return usersController; } var userSave = new UserSave { Id = 1234, Email = "test@test.com", Username = "test@test.com", Culture = "en", Name = "Test", UserGroups = new[] { "writers" } }; var runner = new TestRunner(Factory); var response = await runner.Execute("Users", "PostSaveUser", HttpMethod.Post, new ObjectContent(userSave, new JsonMediaTypeFormatter())); var obj = JsonConvert.DeserializeObject(response.Item2); Assert.AreEqual(userSave.Name, obj.Name); Assert.AreEqual(1234, obj.Id); Assert.AreEqual(userSave.Email, obj.Email); var userGroupAliases = obj.UserGroups.Select(x => x.Alias).ToArray(); foreach (var group in userSave.UserGroups) { Assert.IsTrue(userGroupAliases.Contains(group)); } } [Test] public async System.Threading.Tasks.Task GetPagedUsers_Empty() { ApiController Factory(HttpRequestMessage message, UmbracoHelper helper) { //we need to manually apply automapper mappings with the mocked applicationcontext //InitializeMappers(helper.UmbracoContext.Application); InitializeAutoMapper(true); var usersController = new UsersController(); Container.InjectProperties(usersController); return usersController; } var runner = new TestRunner(Factory); var response = await runner.Execute("Users", "GetPagedUsers", HttpMethod.Get); var obj = JsonConvert.DeserializeObject>(response.Item2); Assert.AreEqual(0, obj.TotalItems); } [Test] public async System.Threading.Tasks.Task GetPagedUsers_10() { ApiController Factory(HttpRequestMessage message, UmbracoHelper helper) { //setup some mocks var userServiceMock = Mock.Get(Current.Services.UserService); var users = MockedUser.CreateMulipleUsers(10); long outVal = 10; userServiceMock.Setup(service => service.GetAll( It.IsAny(), It.IsAny(), out outVal, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(() => users); //we need to manually apply automapper mappings with the mocked applicationcontext //InitializeMappers(helper.UmbracoContext.Application); InitializeAutoMapper(true); var usersController = new UsersController(); Container.InjectProperties(usersController); return usersController; } var runner = new TestRunner(Factory); var response = await runner.Execute("Users", "GetPagedUsers", HttpMethod.Get); var obj = JsonConvert.DeserializeObject>(response.Item2); Assert.AreEqual(10, obj.TotalItems); Assert.AreEqual(10, obj.Items.Count()); } } }