mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-17 05:54:26 +01:00
(Refactor) : Converted Selenium test for CanUseRoleManager and Others to playwright (#6996)
* refactor: resovled merge conflict Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * (Refactor): Removed Selenium Test for CanUseRoleManager Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * Refactor : removed spacing and extra alert message Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * (Test):Converted/Added Playwright Test for CanSigninWithLoginCode Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * (Refactor): Removed Selenium Test for CanSigninWithLoginCode Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * fix: updated UIServerController.Roles.cs to handle storeID Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * refactor : updated some minor nits Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * Fix: Preserve store context when deleting server-wide roles from store page Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> * refactor: fix auth mismatch in role Edit/Remove links for store context Signed-off-by: Abhijay007 <Abhijay007j@gmail.com> --------- Signed-off-by: Abhijay007 <Abhijay007j@gmail.com>
This commit is contained in:
@@ -2581,6 +2581,230 @@ namespace BTCPayServer.Tests
|
|||||||
await s.FindAlertMessage(StatusMessageModel.StatusSeverity.Error, "The user is the last owner. Their role cannot be changed.");
|
await s.FindAlertMessage(StatusMessageModel.StatusSeverity.Error, "The user is the last owner. Their role cannot be changed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
[Trait("Playwright", "Playwright")]
|
||||||
|
public async Task CanUseRoleManager()
|
||||||
|
{
|
||||||
|
await using var s = CreatePlaywrightTester(newDb: true);
|
||||||
|
await s.StartAsync();
|
||||||
|
await s.RegisterNewUser(true);
|
||||||
|
await s.GoToHome();
|
||||||
|
await s.GoToServer(ServerNavPages.Roles);
|
||||||
|
var existingServerRoles = await s.Page.Locator("table tr").AllAsync();
|
||||||
|
Assert.Equal(5, existingServerRoles.Count);
|
||||||
|
ILocator ownerRow = null;
|
||||||
|
ILocator managerRow = null;
|
||||||
|
ILocator employeeRow = null;
|
||||||
|
ILocator guestRow = null;
|
||||||
|
foreach (var roleItem in existingServerRoles)
|
||||||
|
{
|
||||||
|
var text = await roleItem.TextContentAsync();
|
||||||
|
if (text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
ownerRow = roleItem;
|
||||||
|
}
|
||||||
|
else if (text.Contains("manager", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
managerRow = roleItem;
|
||||||
|
}
|
||||||
|
else if (text.Contains("employee", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
employeeRow = roleItem;
|
||||||
|
}
|
||||||
|
else if (text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
guestRow = roleItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.NotNull(ownerRow);
|
||||||
|
Assert.NotNull(managerRow);
|
||||||
|
Assert.NotNull(employeeRow);
|
||||||
|
Assert.NotNull(guestRow);
|
||||||
|
|
||||||
|
var ownerBadges = await ownerRow.Locator(".badge").AllAsync();
|
||||||
|
var ownerBadgeTexts = await Task.WhenAll(ownerBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.Contains(ownerBadgeTexts, text => text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
Assert.Contains(ownerBadgeTexts, text => text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
var managerBadges = await managerRow.Locator(".badge").AllAsync();
|
||||||
|
var managerBadgeTexts = await Task.WhenAll(managerBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.DoesNotContain(managerBadgeTexts, text => text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
Assert.Contains(managerBadgeTexts, text => text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
var employeeBadges = await employeeRow.Locator(".badge").AllAsync();
|
||||||
|
var employeeBadgeTexts = await Task.WhenAll(employeeBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.DoesNotContain(employeeBadgeTexts, text => text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
Assert.Contains(employeeBadgeTexts, text => text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
var guestBadges = await guestRow.Locator(".badge").AllAsync();
|
||||||
|
var guestBadgeTexts = await Task.WhenAll(guestBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.DoesNotContain(guestBadgeTexts, text => text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
Assert.Contains(guestBadgeTexts, text => text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
await guestRow.Locator("#SetDefault").ClickAsync();
|
||||||
|
await s.FindAlertMessage(partialText: "Role set default");
|
||||||
|
|
||||||
|
existingServerRoles = await s.Page.Locator("table tr").AllAsync();
|
||||||
|
foreach (var roleItem in existingServerRoles)
|
||||||
|
{
|
||||||
|
var text = await roleItem.TextContentAsync();
|
||||||
|
if (text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
ownerRow = roleItem;
|
||||||
|
}
|
||||||
|
else if (text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
guestRow = roleItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
guestBadges = await guestRow.Locator(".badge").AllAsync();
|
||||||
|
var guestBadgeTexts2 = await Task.WhenAll(guestBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.Contains(guestBadgeTexts2, text => text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
ownerBadges = await ownerRow.Locator(".badge").AllAsync();
|
||||||
|
var ownerBadgeTexts2 = await Task.WhenAll(ownerBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.DoesNotContain(ownerBadgeTexts2, text => text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
await ownerRow.Locator("#SetDefault").ClickAsync();
|
||||||
|
|
||||||
|
await s.FindAlertMessage(partialText: "Role set default");
|
||||||
|
|
||||||
|
await s.CreateNewStore();
|
||||||
|
await s.GoToStore(StoreNavPages.Roles);
|
||||||
|
existingServerRoles = await s.Page.Locator("table tr").AllAsync();
|
||||||
|
Assert.Equal(5, existingServerRoles.Count);
|
||||||
|
var serverRoleTexts = await Task.WhenAll(existingServerRoles.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.Equal(4, serverRoleTexts.Count(text => text.Contains("Server-wide", StringComparison.InvariantCultureIgnoreCase)));
|
||||||
|
|
||||||
|
foreach (var roleItem in existingServerRoles)
|
||||||
|
{
|
||||||
|
var text = await roleItem.TextContentAsync();
|
||||||
|
if (text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
ownerRow = roleItem;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await ownerRow.Locator("text=Remove").ClickAsync();
|
||||||
|
await s.Page.WaitForLoadStateAsync();
|
||||||
|
Assert.DoesNotContain("ConfirmContinue", await s.Page.ContentAsync());
|
||||||
|
await s.Page.GoBackAsync();
|
||||||
|
existingServerRoles = await s.Page.Locator("table tr").AllAsync();
|
||||||
|
foreach (var roleItem in existingServerRoles)
|
||||||
|
{
|
||||||
|
var text = await roleItem.TextContentAsync();
|
||||||
|
if (text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
guestRow = roleItem;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await guestRow.Locator("text=Remove").ClickAsync();
|
||||||
|
await s.Page.ClickAsync("#ConfirmContinue");
|
||||||
|
await s.FindAlertMessage();
|
||||||
|
|
||||||
|
await s.GoToStore(StoreNavPages.Roles);
|
||||||
|
await s.ClickPagePrimary();
|
||||||
|
|
||||||
|
Assert.Contains("Create role", await s.Page.ContentAsync());
|
||||||
|
await s.ClickPagePrimary();
|
||||||
|
await s.Page.Locator("#Role").FillAsync("store role");
|
||||||
|
await s.ClickPagePrimary();
|
||||||
|
await s.FindAlertMessage();
|
||||||
|
|
||||||
|
existingServerRoles = await s.Page.Locator("table tr").AllAsync();
|
||||||
|
foreach (var roleItem in existingServerRoles)
|
||||||
|
{
|
||||||
|
var text = await roleItem.TextContentAsync();
|
||||||
|
if (text.Contains("store role", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
guestRow = roleItem;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
guestBadges = await guestRow.Locator(".badge").AllAsync();
|
||||||
|
var guestBadgeTexts3 = await Task.WhenAll(guestBadges.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.DoesNotContain(guestBadgeTexts3, text => text.Equals("server-wide", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
await s.GoToStore(StoreNavPages.Users);
|
||||||
|
var options = await s.Page.Locator("#Role option").AllAsync();
|
||||||
|
Assert.Equal(4, options.Count);
|
||||||
|
var optionTexts = await Task.WhenAll(options.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.Contains(optionTexts, text => text.Equals("store role", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
await s.CreateNewStore();
|
||||||
|
await s.GoToStore(StoreNavPages.Roles);
|
||||||
|
existingServerRoles = await s.Page.Locator("table tr").AllAsync();
|
||||||
|
Assert.Equal(4, existingServerRoles.Count);
|
||||||
|
var serverRoleTexts2 = await Task.WhenAll(existingServerRoles.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.Equal(3, serverRoleTexts2.Count(text => text.Contains("Server-wide", StringComparison.InvariantCultureIgnoreCase)));
|
||||||
|
Assert.Equal(0, serverRoleTexts2.Count(text => text.Contains("store role", StringComparison.InvariantCultureIgnoreCase)));
|
||||||
|
await s.GoToStore(StoreNavPages.Users);
|
||||||
|
options = await s.Page.Locator("#Role option").AllAsync();
|
||||||
|
Assert.Equal(3, options.Count);
|
||||||
|
var optionTexts2 = await Task.WhenAll(options.Select(async element => await element.TextContentAsync()));
|
||||||
|
Assert.DoesNotContain(optionTexts2, text => text.Equals("store role", StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
await s.Page.Locator("#Email").FillAsync(s.AsTestAccount().Email);
|
||||||
|
await s.Page.Locator("#Role").SelectOptionAsync("Owner");
|
||||||
|
await s.Page.ClickAsync("#AddUser");
|
||||||
|
Assert.Contains("The user already has the role Owner.", await s.Page.Locator(".validation-summary-errors").TextContentAsync());
|
||||||
|
await s.Page.Locator("#Role").SelectOptionAsync("Manager");
|
||||||
|
await s.Page.ClickAsync("#AddUser");
|
||||||
|
Assert.Contains("The user is the last owner. Their role cannot be changed.", await s.Page.Locator(".validation-summary-errors").TextContentAsync());
|
||||||
|
|
||||||
|
await s.GoToStore(StoreNavPages.Roles);
|
||||||
|
await s.ClickPagePrimary();
|
||||||
|
await s.Page.Locator("#Role").FillAsync("Malice");
|
||||||
|
|
||||||
|
await s.Page.EvaluateAsync($"document.getElementById('Policies')['{Policies.CanModifyServerSettings}']=new Option('{Policies.CanModifyServerSettings}', '{Policies.CanModifyServerSettings}', true,true);");
|
||||||
|
|
||||||
|
await s.ClickPagePrimary();
|
||||||
|
await s.FindAlertMessage();
|
||||||
|
Assert.Contains("Malice", await s.Page.ContentAsync());
|
||||||
|
Assert.DoesNotContain(Policies.CanModifyServerSettings, await s.Page.ContentAsync());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
[Trait("Playwright", "Playwright")]
|
||||||
|
public async Task CanSigninWithLoginCode()
|
||||||
|
{
|
||||||
|
await using var s = CreatePlaywrightTester();
|
||||||
|
await s.StartAsync();
|
||||||
|
var user = await s.RegisterNewUser();
|
||||||
|
await s.GoToHome();
|
||||||
|
await s.GoToProfile(ManageNavPages.LoginCodes);
|
||||||
|
|
||||||
|
string code = null;
|
||||||
|
await s.Page.WaitForSelectorAsync("#LoginCode .qr-code");
|
||||||
|
code = await s.Page.Locator("#LoginCode .qr-code").GetAttributeAsync("alt");
|
||||||
|
string prevCode = code;
|
||||||
|
await s.Page.ReloadAsync();
|
||||||
|
await s.Page.WaitForSelectorAsync("#LoginCode .qr-code");
|
||||||
|
code = await s.Page.Locator("#LoginCode .qr-code").GetAttributeAsync("alt");
|
||||||
|
Assert.NotEqual(prevCode, code);
|
||||||
|
await s.Page.WaitForSelectorAsync("#LoginCode .qr-code");
|
||||||
|
code = await s.Page.Locator("#LoginCode .qr-code").GetAttributeAsync("alt");
|
||||||
|
await s.Logout();
|
||||||
|
await s.GoToLogin();
|
||||||
|
await s.Page.EvaluateAsync("document.getElementById('LoginCode').value = 'bad code'");
|
||||||
|
await s.Page.EvaluateAsync("document.getElementById('logincode-form').submit()");
|
||||||
|
await s.Page.WaitForLoadStateAsync();
|
||||||
|
|
||||||
|
await s.GoToLogin();
|
||||||
|
await s.Page.EvaluateAsync($"document.getElementById('LoginCode').value = '{code}'");
|
||||||
|
await s.Page.EvaluateAsync("document.getElementById('logincode-form').submit()");
|
||||||
|
await s.Page.WaitForLoadStateAsync();
|
||||||
|
await s.Page.WaitForLoadStateAsync();
|
||||||
|
|
||||||
|
await s.CreateNewStore();
|
||||||
|
await s.GoToHome();
|
||||||
|
await s.Page.WaitForLoadStateAsync();
|
||||||
|
await s.Page.WaitForLoadStateAsync();
|
||||||
|
var content = await s.Page.ContentAsync();
|
||||||
|
Assert.Contains(user, content);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1353,34 +1353,6 @@ namespace BTCPayServer.Tests
|
|||||||
Assert.Contains(lnUsername, source);
|
Assert.Contains(lnUsername, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
|
||||||
[Trait("Selenium", "Selenium")]
|
|
||||||
public async Task CanSigninWithLoginCode()
|
|
||||||
{
|
|
||||||
using var s = CreateSeleniumTester();
|
|
||||||
await s.StartAsync();
|
|
||||||
var user = s.RegisterNewUser();
|
|
||||||
s.GoToHome();
|
|
||||||
s.GoToProfile(ManageNavPages.LoginCodes);
|
|
||||||
|
|
||||||
string code = null;
|
|
||||||
TestUtils.Eventually(() => { code = s.Driver.FindElement(By.CssSelector("#LoginCode .qr-code")).GetAttribute("alt"); });
|
|
||||||
string prevCode = code;
|
|
||||||
await s.Driver.Navigate().RefreshAsync();
|
|
||||||
TestUtils.Eventually(() => { code = s.Driver.FindElement(By.CssSelector("#LoginCode .qr-code")).GetAttribute("alt"); });
|
|
||||||
Assert.NotEqual(prevCode, code);
|
|
||||||
TestUtils.Eventually(() => { code = s.Driver.FindElement(By.CssSelector("#LoginCode .qr-code")).GetAttribute("alt"); });
|
|
||||||
s.Logout();
|
|
||||||
s.GoToLogin();
|
|
||||||
s.Driver.SetAttribute("LoginCode", "value", "bad code");
|
|
||||||
s.Driver.InvokeJSFunction("logincode-form", "submit");
|
|
||||||
|
|
||||||
s.Driver.SetAttribute("LoginCode", "value", code);
|
|
||||||
s.Driver.InvokeJSFunction("logincode-form", "submit");
|
|
||||||
s.GoToHome();
|
|
||||||
Assert.Contains(user, s.Driver.PageSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For god know why, selenium have problems clicking on the save button, resulting in ultimate hacks
|
// For god know why, selenium have problems clicking on the save button, resulting in ultimate hacks
|
||||||
// to make it works.
|
// to make it works.
|
||||||
private void SudoForceSaveLightningSettingsRightNowAndFast(SeleniumTester s, string cryptoCode)
|
private void SudoForceSaveLightningSettingsRightNowAndFast(SeleniumTester s, string cryptoCode)
|
||||||
@@ -1399,175 +1371,6 @@ retry:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
|
||||||
[Trait("Selenium", "Selenium")]
|
|
||||||
public async Task CanUseRoleManager()
|
|
||||||
{
|
|
||||||
using var s = CreateSeleniumTester(newDb: true);
|
|
||||||
await s.StartAsync();
|
|
||||||
s.RegisterNewUser(true);
|
|
||||||
s.GoToHome();
|
|
||||||
s.GoToServer(ServerNavPages.Roles);
|
|
||||||
var existingServerRoles = s.Driver.FindElement(By.CssSelector("table")).FindElements(By.CssSelector("tr"));
|
|
||||||
Assert.Equal(5, existingServerRoles.Count);
|
|
||||||
IWebElement ownerRow = null;
|
|
||||||
IWebElement managerRow = null;
|
|
||||||
IWebElement employeeRow = null;
|
|
||||||
IWebElement guestRow = null;
|
|
||||||
foreach (var roleItem in existingServerRoles)
|
|
||||||
{
|
|
||||||
if (roleItem.Text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
ownerRow = roleItem;
|
|
||||||
}
|
|
||||||
else if (roleItem.Text.Contains("manager", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
managerRow = roleItem;
|
|
||||||
}
|
|
||||||
else if (roleItem.Text.Contains("employee", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
employeeRow = roleItem;
|
|
||||||
}
|
|
||||||
else if (roleItem.Text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
guestRow = roleItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert.NotNull(ownerRow);
|
|
||||||
Assert.NotNull(managerRow);
|
|
||||||
Assert.NotNull(employeeRow);
|
|
||||||
Assert.NotNull(guestRow);
|
|
||||||
|
|
||||||
var ownerBadges = ownerRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.Contains(ownerBadges, element => element.Text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
Assert.Contains(ownerBadges, element => element.Text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
|
|
||||||
var managerBadges = managerRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.DoesNotContain(managerBadges, element => element.Text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
Assert.Contains(managerBadges, element => element.Text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
|
|
||||||
var employeeBadges = employeeRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.DoesNotContain(employeeBadges, element => element.Text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
Assert.Contains(employeeBadges, element => element.Text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
|
|
||||||
var guestBadges = guestRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.DoesNotContain(guestBadges, element => element.Text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
Assert.Contains(guestBadges, element => element.Text.Equals("Server-wide", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
guestRow.FindElement(By.Id("SetDefault")).Click();
|
|
||||||
Assert.Contains("Role set default", s.FindAlertMessage().Text);
|
|
||||||
|
|
||||||
existingServerRoles = s.Driver.FindElement(By.CssSelector("table")).FindElements(By.CssSelector("tr"));
|
|
||||||
foreach (var roleItem in existingServerRoles)
|
|
||||||
{
|
|
||||||
if (roleItem.Text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
ownerRow = roleItem;
|
|
||||||
}
|
|
||||||
else if (roleItem.Text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
guestRow = roleItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
guestBadges = guestRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.Contains(guestBadges, element => element.Text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
|
|
||||||
ownerBadges = ownerRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.DoesNotContain(ownerBadges, element => element.Text.Equals("Default", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
ownerRow.FindElement(By.Id("SetDefault")).Click();
|
|
||||||
s.FindAlertMessage();
|
|
||||||
|
|
||||||
Assert.Contains("Role set default", s.FindAlertMessage().Text);
|
|
||||||
|
|
||||||
s.CreateNewStore();
|
|
||||||
s.GoToStore(StoreNavPages.Roles);
|
|
||||||
var existingStoreRoles = s.Driver.FindElement(By.CssSelector("table")).FindElements(By.CssSelector("tr"));
|
|
||||||
Assert.Equal(5, existingStoreRoles.Count);
|
|
||||||
Assert.Equal(4, existingStoreRoles.Count(element => element.Text.Contains("Server-wide", StringComparison.InvariantCultureIgnoreCase)));
|
|
||||||
|
|
||||||
foreach (var roleItem in existingStoreRoles)
|
|
||||||
{
|
|
||||||
if (roleItem.Text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
ownerRow = roleItem;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ownerRow.FindElement(By.LinkText("Remove")).Click();
|
|
||||||
Assert.DoesNotContain("ConfirmContinue", s.Driver.PageSource);
|
|
||||||
s.Driver.Navigate().Back();
|
|
||||||
existingStoreRoles = s.Driver.FindElement(By.CssSelector("table")).FindElements(By.CssSelector("tr"));
|
|
||||||
foreach (var roleItem in existingStoreRoles)
|
|
||||||
{
|
|
||||||
if (roleItem.Text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
guestRow = roleItem;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
guestRow.FindElement(By.LinkText("Remove")).Click();
|
|
||||||
s.Driver.FindElement(By.Id("ConfirmContinue")).Click();
|
|
||||||
s.FindAlertMessage();
|
|
||||||
|
|
||||||
s.GoToStore(StoreNavPages.Roles);
|
|
||||||
s.ClickPagePrimary();
|
|
||||||
|
|
||||||
Assert.Contains("Create role", s.Driver.PageSource);
|
|
||||||
s.ClickPagePrimary();
|
|
||||||
s.Driver.FindElement(By.Id("Role")).SendKeys("store role");
|
|
||||||
s.ClickPagePrimary();
|
|
||||||
s.FindAlertMessage();
|
|
||||||
|
|
||||||
existingStoreRoles = s.Driver.FindElement(By.CssSelector("table")).FindElements(By.CssSelector("tr"));
|
|
||||||
foreach (var roleItem in existingStoreRoles)
|
|
||||||
{
|
|
||||||
if (roleItem.Text.Contains("store role", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
guestRow = roleItem;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
guestBadges = guestRow.FindElements(By.CssSelector(".badge"));
|
|
||||||
Assert.DoesNotContain(guestBadges, element => element.Text.Equals("server-wide", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
s.GoToStore(StoreNavPages.Users);
|
|
||||||
var options = s.Driver.FindElements(By.CssSelector("#Role option"));
|
|
||||||
Assert.Equal(4, options.Count);
|
|
||||||
Assert.Contains(options, element => element.Text.Equals("store role", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
s.CreateNewStore();
|
|
||||||
s.GoToStore(StoreNavPages.Roles);
|
|
||||||
existingStoreRoles = s.Driver.FindElement(By.CssSelector("table")).FindElements(By.CssSelector("tr"));
|
|
||||||
Assert.Equal(4, existingStoreRoles.Count);
|
|
||||||
Assert.Equal(3, existingStoreRoles.Count(element => element.Text.Contains("Server-wide", StringComparison.InvariantCultureIgnoreCase)));
|
|
||||||
Assert.Equal(0, existingStoreRoles.Count(element => element.Text.Contains("store role", StringComparison.InvariantCultureIgnoreCase)));
|
|
||||||
s.GoToStore(StoreNavPages.Users);
|
|
||||||
options = s.Driver.FindElements(By.CssSelector("#Role option"));
|
|
||||||
Assert.Equal(3, options.Count);
|
|
||||||
Assert.DoesNotContain(options, element => element.Text.Equals("store role", StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
|
|
||||||
s.Driver.FindElement(By.Id("Email")).SendKeys(s.AsTestAccount().Email);
|
|
||||||
s.Driver.FindElement(By.Id("Role")).SendKeys("owner");
|
|
||||||
s.Driver.FindElement(By.Id("AddUser")).Click();
|
|
||||||
Assert.Contains("The user already has the role Owner.", s.Driver.FindElement(By.CssSelector(".validation-summary-errors")).Text);
|
|
||||||
s.Driver.FindElement(By.Id("Role")).SendKeys("manager");
|
|
||||||
s.Driver.FindElement(By.Id("AddUser")).Click();
|
|
||||||
Assert.Contains("The user is the last owner. Their role cannot be changed.", s.Driver.FindElement(By.CssSelector(".validation-summary-errors")).Text);
|
|
||||||
|
|
||||||
s.GoToStore(StoreNavPages.Roles);
|
|
||||||
s.ClickPagePrimary();
|
|
||||||
s.Driver.FindElement(By.Id("Role")).SendKeys("Malice");
|
|
||||||
|
|
||||||
s.Driver.ExecuteJavaScript($"document.getElementById('Policies')['{Policies.CanModifyServerSettings}']=new Option('{Policies.CanModifyServerSettings}', '{Policies.CanModifyServerSettings}', true,true);");
|
|
||||||
|
|
||||||
s.ClickPagePrimary();
|
|
||||||
s.FindAlertMessage();
|
|
||||||
Assert.Contains("Malice",s.Driver.PageSource);
|
|
||||||
Assert.DoesNotContain(Policies.CanModifyServerSettings,s.Driver.PageSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static string AssertUrlHasPairingCode(SeleniumTester s)
|
private static string AssertUrlHasPairingCode(SeleniumTester s)
|
||||||
{
|
{
|
||||||
var regex = Regex.Match(new Uri(s.Driver.Url, UriKind.Absolute).Query, "pairingCode=([^&]*)");
|
var regex = Regex.Match(new Uri(s.Driver.Url, UriKind.Absolute).Query, "pairingCode=([^&]*)");
|
||||||
|
|||||||
@@ -122,7 +122,11 @@ public partial class UIStoresController
|
|||||||
[FromServices] StoreRepository storeRepository,
|
[FromServices] StoreRepository storeRepository,
|
||||||
string role)
|
string role)
|
||||||
{
|
{
|
||||||
var roleData = await storeRepository.GetStoreRole(new StoreRoleId(storeId, role), true);
|
var roleId = await storeRepository.ResolveStoreRoleId(storeId, role);
|
||||||
|
if (roleId == null)
|
||||||
|
return NotFound();
|
||||||
|
|
||||||
|
var roleData = await storeRepository.GetStoreRole(roleId, true);
|
||||||
if (roleData == null)
|
if (roleData == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
|
|
||||||
@@ -142,7 +146,10 @@ public partial class UIStoresController
|
|||||||
[FromServices] StoreRepository storeRepository,
|
[FromServices] StoreRepository storeRepository,
|
||||||
string role)
|
string role)
|
||||||
{
|
{
|
||||||
var roleId = new StoreRoleId(storeId, role);
|
var roleId = await storeRepository.ResolveStoreRoleId(storeId, role);
|
||||||
|
if (roleId == null)
|
||||||
|
return NotFound();
|
||||||
|
|
||||||
var roleData = await storeRepository.GetStoreRole(roleId, true);
|
var roleData = await storeRepository.GetStoreRole(roleId, true);
|
||||||
if (roleData == null)
|
if (roleData == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
|
|||||||
@@ -118,8 +118,8 @@
|
|||||||
{
|
{
|
||||||
<a permission="@Policies.CanModifyServerSettings" asp-action="SetDefaultRole" asp-route-role="@role.Role" asp-controller="UIServer" id="SetDefault" text-translate="true">Set as default</a>
|
<a permission="@Policies.CanModifyServerSettings" asp-action="SetDefaultRole" asp-route-role="@role.Role" asp-controller="UIServer" id="SetDefault" text-translate="true">Set as default</a>
|
||||||
}
|
}
|
||||||
<a permission="@(role.IsServerRole ? Policies.CanModifyServerSettings : Policies.CanModifyStoreSettings)" asp-action="CreateOrEditRole" asp-route-storeId="@storeId" asp-route-role="@role.Role" asp-controller="@(role.IsServerRole ? "UIServer" : "UIStores")" text-translate="true">Edit</a>
|
<a permission="@(role.IsServerRole && string.IsNullOrEmpty(storeId) ? Policies.CanModifyServerSettings : Policies.CanModifyStoreSettings)" asp-action="CreateOrEditRole" asp-route-storeId="@storeId" asp-route-role="@role.Role" asp-controller="@(role.IsServerRole && string.IsNullOrEmpty(storeId) ? "UIServer" : "UIStores")" text-translate="true">Edit</a>
|
||||||
<a permission="@(role.IsServerRole ? Policies.CanModifyServerSettings : Policies.CanModifyStoreSettings)" asp-action="DeleteRole" asp-route-storeId="@storeId" asp-route-role="@role.Role" asp-controller="@(role.IsServerRole ? "UIServer" : "UIStores")" text-translate="true">Remove</a>
|
<a permission="@(role.IsServerRole && string.IsNullOrEmpty(storeId) ? Policies.CanModifyServerSettings : Policies.CanModifyStoreSettings)" asp-action="DeleteRole" asp-route-storeId="@storeId" asp-route-role="@role.Role" asp-controller="@(role.IsServerRole && string.IsNullOrEmpty(storeId) ? "UIServer" : "UIStores")" text-translate="true">Remove</a>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user