mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-02-22 14:22:40 +01:00
Profile email change should check email's availability
This commit is contained in:
parent
f4fa7c927c
commit
2e864c32fa
6 changed files with 74 additions and 34 deletions
|
@ -74,3 +74,12 @@ If you still have issues, try to restart docker.
|
||||||
Run `dotnet user-secrets set RunSeleniumInBrowser true` to run tests in browser.
|
Run `dotnet user-secrets set RunSeleniumInBrowser true` to run tests in browser.
|
||||||
|
|
||||||
To switch back to headless mode (recommended) you can run `dotnet user-secrets remove RunSeleniumInBrowser`.
|
To switch back to headless mode (recommended) you can run `dotnet user-secrets remove RunSeleniumInBrowser`.
|
||||||
|
|
||||||
|
### Session not created: This version of ChromeDriver only supports Chrome version 88
|
||||||
|
|
||||||
|
When you run tests for selenium, you may end up with this error.
|
||||||
|
This happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.
|
||||||
|
|
||||||
|
If you want to use a older chrome driver on [this page](https://chromedriver.chromium.org/downloads) then point to it with
|
||||||
|
|
||||||
|
`dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"`
|
||||||
|
|
|
@ -46,6 +46,10 @@ namespace BTCPayServer.Tests
|
||||||
var runInBrowser = config["RunSeleniumInBrowser"] == "true";
|
var runInBrowser = config["RunSeleniumInBrowser"] == "true";
|
||||||
// Reset this using `dotnet user-secrets remove RunSeleniumInBrowser`
|
// Reset this using `dotnet user-secrets remove RunSeleniumInBrowser`
|
||||||
|
|
||||||
|
|
||||||
|
var chromeDriverPath = config["ChromeDriverDirectory"] ??
|
||||||
|
(Server.PayTester.InContainer ? "/usr/bin" : Directory.GetCurrentDirectory());
|
||||||
|
|
||||||
var options = new ChromeOptions();
|
var options = new ChromeOptions();
|
||||||
if (Server.PayTester.InContainer)
|
if (Server.PayTester.InContainer)
|
||||||
{
|
{
|
||||||
|
@ -58,7 +62,7 @@ namespace BTCPayServer.Tests
|
||||||
}
|
}
|
||||||
options.AddArguments($"window-size={windowSize.Width}x{windowSize.Height}");
|
options.AddArguments($"window-size={windowSize.Width}x{windowSize.Height}");
|
||||||
options.AddArgument("shm-size=2g");
|
options.AddArgument("shm-size=2g");
|
||||||
Driver = new ChromeDriver(Server.PayTester.InContainer ? "/usr/bin" : Directory.GetCurrentDirectory(), options);
|
Driver = new ChromeDriver(chromeDriverPath, options);
|
||||||
|
|
||||||
if (runInBrowser)
|
if (runInBrowser)
|
||||||
{
|
{
|
||||||
|
@ -74,8 +78,13 @@ namespace BTCPayServer.Tests
|
||||||
Driver.AssertNoError();
|
Driver.AssertNoError();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IWebElement FindAlertMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success) =>
|
internal IWebElement FindAlertMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success)
|
||||||
Driver.FindElement(By.ClassName($"alert-{StatusMessageModel.ToString(severity)}"));
|
{
|
||||||
|
var el = Driver.FindElements(By.ClassName($"alert-{StatusMessageModel.ToString(severity)}")).FirstOrDefault(e => e.Displayed);
|
||||||
|
if (el is null)
|
||||||
|
throw new NoSuchElementException($"Unable to find alert-{StatusMessageModel.ToString(severity)}");
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
|
||||||
public static readonly TimeSpan ImplicitWait = TimeSpan.FromSeconds(5);
|
public static readonly TimeSpan ImplicitWait = TimeSpan.FromSeconds(5);
|
||||||
public string Link(string relativeLink)
|
public string Link(string relativeLink)
|
||||||
|
|
|
@ -9,8 +9,10 @@ using BTCPayServer.Client.Models;
|
||||||
using BTCPayServer.Data;
|
using BTCPayServer.Data;
|
||||||
using BTCPayServer.Services.Wallets;
|
using BTCPayServer.Services.Wallets;
|
||||||
using BTCPayServer.Tests.Logging;
|
using BTCPayServer.Tests.Logging;
|
||||||
|
using BTCPayServer.Views.Manage;
|
||||||
using BTCPayServer.Views.Server;
|
using BTCPayServer.Views.Server;
|
||||||
using BTCPayServer.Views.Wallets;
|
using BTCPayServer.Views.Wallets;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using NBitcoin;
|
using NBitcoin;
|
||||||
using NBitcoin.DataEncoders;
|
using NBitcoin.DataEncoders;
|
||||||
|
@ -87,6 +89,45 @@ namespace BTCPayServer.Tests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact(Timeout = TestTimeout)]
|
||||||
|
[Trait("Selenium", "Selenium")]
|
||||||
|
public async Task CanChangeUserMail()
|
||||||
|
{
|
||||||
|
using (var s = SeleniumTester.Create())
|
||||||
|
{
|
||||||
|
await s.StartAsync();
|
||||||
|
|
||||||
|
var tester = s.Server;
|
||||||
|
var u1 = tester.NewAccount();
|
||||||
|
u1.GrantAccess();
|
||||||
|
await u1.MakeAdmin(false);
|
||||||
|
|
||||||
|
var u2 = tester.NewAccount();
|
||||||
|
u2.GrantAccess();
|
||||||
|
await u2.MakeAdmin(false);
|
||||||
|
|
||||||
|
s.GoToLogin();
|
||||||
|
s.Login(u1.RegisterDetails.Email, u1.RegisterDetails.Password);
|
||||||
|
s.GoToProfile(ManageNavPages.Index);
|
||||||
|
s.Driver.FindElement(By.Id("Email")).Clear();
|
||||||
|
s.Driver.FindElement(By.Id("Email")).SendKeys(u2.RegisterDetails.Email);
|
||||||
|
s.Driver.FindElement(By.Id("save")).Click();
|
||||||
|
|
||||||
|
s.FindAlertMessage(Abstractions.Models.StatusMessageModel.StatusSeverity.Error);
|
||||||
|
|
||||||
|
s.GoToProfile(ManageNavPages.Index);
|
||||||
|
s.Driver.FindElement(By.Id("Email")).Clear();
|
||||||
|
var changedEmail = Guid.NewGuid() + "@lol.com";
|
||||||
|
s.Driver.FindElement(By.Id("Email")).SendKeys(changedEmail);
|
||||||
|
s.Driver.FindElement(By.Id("save")).Click();
|
||||||
|
s.FindAlertMessage(StatusMessageModel.StatusSeverity.Success);
|
||||||
|
|
||||||
|
var manager = tester.PayTester.GetService<UserManager<ApplicationUser>>();
|
||||||
|
Assert.NotNull(await manager.FindByNameAsync(changedEmail));
|
||||||
|
Assert.NotNull(await manager.FindByEmailAsync(changedEmail));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact(Timeout = TestTimeout)]
|
[Fact(Timeout = TestTimeout)]
|
||||||
public async Task NewUserLogin()
|
public async Task NewUserLogin()
|
||||||
{
|
{
|
||||||
|
|
|
@ -82,7 +82,6 @@ namespace BTCPayServer.Controllers
|
||||||
{
|
{
|
||||||
Username = user.UserName,
|
Username = user.UserName,
|
||||||
Email = user.Email,
|
Email = user.Email,
|
||||||
PhoneNumber = user.PhoneNumber,
|
|
||||||
IsEmailConfirmed = user.EmailConfirmed
|
IsEmailConfirmed = user.EmailConfirmed
|
||||||
};
|
};
|
||||||
return View(model);
|
return View(model);
|
||||||
|
@ -97,8 +96,6 @@ namespace BTCPayServer.Controllers
|
||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needUpdate = false;
|
|
||||||
|
|
||||||
var user = await _userManager.GetUserAsync(User);
|
var user = await _userManager.GetUserAsync(User);
|
||||||
if (user == null)
|
if (user == null)
|
||||||
{
|
{
|
||||||
|
@ -108,33 +105,22 @@ namespace BTCPayServer.Controllers
|
||||||
var email = user.Email;
|
var email = user.Email;
|
||||||
if (model.Email != email)
|
if (model.Email != email)
|
||||||
{
|
{
|
||||||
|
if (!(await _userManager.FindByEmailAsync(model.Email) is null))
|
||||||
|
{
|
||||||
|
TempData[WellKnownTempData.ErrorMessage] = "This email already exists";
|
||||||
|
return RedirectToAction(nameof(Index));
|
||||||
|
}
|
||||||
|
var setUserResult = await _userManager.SetUserNameAsync(user, model.Email);
|
||||||
|
if (!setUserResult.Succeeded)
|
||||||
|
{
|
||||||
|
throw new ApplicationException($"Unexpected error occurred setting email for user with ID '{user.Id}'.");
|
||||||
|
}
|
||||||
var setEmailResult = await _userManager.SetEmailAsync(user, model.Email);
|
var setEmailResult = await _userManager.SetEmailAsync(user, model.Email);
|
||||||
if (!setEmailResult.Succeeded)
|
if (!setEmailResult.Succeeded)
|
||||||
{
|
{
|
||||||
throw new ApplicationException($"Unexpected error occurred setting email for user with ID '{user.Id}'.");
|
throw new ApplicationException($"Unexpected error occurred setting email for user with ID '{user.Id}'.");
|
||||||
}
|
}
|
||||||
await _userManager.SetUserNameAsync(user, model.Username);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var phoneNumber = user.PhoneNumber;
|
|
||||||
if (model.PhoneNumber != phoneNumber)
|
|
||||||
{
|
|
||||||
var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, model.PhoneNumber);
|
|
||||||
if (!setPhoneResult.Succeeded)
|
|
||||||
{
|
|
||||||
throw new ApplicationException($"Unexpected error occurred setting phone number for user with ID '{user.Id}'.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needUpdate)
|
|
||||||
{
|
|
||||||
var result = await _userManager.UpdateAsync(user);
|
|
||||||
if (!result.Succeeded)
|
|
||||||
{
|
|
||||||
throw new ApplicationException($"Unexpected error occurred updating user with ID '{user.Id}'.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TempData[WellKnownTempData.SuccessMessage] = "Your profile has been updated";
|
TempData[WellKnownTempData.SuccessMessage] = "Your profile has been updated";
|
||||||
return RedirectToAction(nameof(Index));
|
return RedirectToAction(nameof(Index));
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,10 +17,5 @@ namespace BTCPayServer.Models.ManageViewModels
|
||||||
|
|
||||||
public bool IsEmailConfirmed { get; set; }
|
public bool IsEmailConfirmed { get; set; }
|
||||||
|
|
||||||
[Phone]
|
|
||||||
[Display(Name = "Phone number")]
|
|
||||||
[MaxLength(50)]
|
|
||||||
public string PhoneNumber { get; set; }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@model IndexViewModel
|
@model IndexViewModel
|
||||||
@{
|
@{
|
||||||
ViewData.SetActivePageAndTitle(ManageNavPages.Index, "Profile");
|
ViewData.SetActivePageAndTitle(ManageNavPages.Index, "Profile");
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
<button type="submit" id="save" class="btn btn-primary">Save</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
|
|
Loading…
Add table
Reference in a new issue