diff --git a/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs b/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs index 4bf1a73f9..927767d1e 100644 --- a/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs +++ b/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs @@ -156,13 +156,12 @@ public async Task UserAlreadyExistRegisterTest() registerResult.Errors.Should().BeNullOrEmpty(); registerResult.Value.AccessToken.Should().NotBeNullOrEmpty(); - var secondRegisterResult = await _authServiceClient.Register(userData); + var result = await _authServiceClient.Register(userData); - secondRegisterResult.Succeeded.Should().BeFalse(); - secondRegisterResult.Errors.Should() + result.Succeeded.Should().BeFalse(); + result.Errors.Should() .BeEquivalentTo("Пользователь уже зарегистрирован"); - - secondRegisterResult.Value.Should().BeNull(); + result.Value.Should().BeNull(); } [Test] diff --git a/HwProj.AuthService/HwProj.AuthService.SeleniumTests/AuthServiceTests.cs b/HwProj.AuthService/HwProj.AuthService.SeleniumTests/AuthServiceTests.cs new file mode 100644 index 000000000..332c81f36 --- /dev/null +++ b/HwProj.AuthService/HwProj.AuthService.SeleniumTests/AuthServiceTests.cs @@ -0,0 +1,336 @@ +using System; +using System.IO; +using System.Net.Mail; +using System.Reflection; +using AutoFixture; +using FluentAssertions; +using HwProj.PageObjects; +using HwProj.PageObjects.AuthServicePageObjects; +using NUnit.Framework; +using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; + +namespace HwProj.AuthService.SeleniumTests +{ + public class Tests + { + private IWebDriver _webDriver; + private readonly string _url = "http://localhost:3000/"; + + [SetUp] + public void Setup() + { + _webDriver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); + _webDriver.Navigate().GoToUrl(_url); + } + + [Test] + public void RegisterTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName); + + WaitUntil.WaitLocation(_webDriver, _url, 5); + + var currentUrl = _webDriver.Url; + currentUrl.Should().Be(_url); + } + + [Test] + public void UserRegistrationTwiceTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .SignOff() + .MoveToRegister() + .Register(name, surname, email, password, password, middleName); + + var result = new RegisterPageObject(_webDriver).GetResult(); + + result.Should().Be("Пользователь уже зарегистрирован"); + } + + [Test] + public void RegisterUserWithDifferentPasswordsTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + var confirmPassword = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, confirmPassword, middleName); + + var result = new RegisterPageObject(_webDriver).GetResult(); + + result.Should().Be("Пароли не совпадают"); + } + + [Test] + public void LoginTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .SignOff() + .MoveToLogin() + .Login(email, password); + + WaitUntil.WaitLocation(_webDriver, _url, 5); + + var currentUrl = _webDriver.Url; + currentUrl.Should().Be(_url); + } + + [Test] + public void LoginUnregisteredUserTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var email = GenerateEmail(); + var password = GenerateString(); + + mainMenu + .MoveToLogin() + .Login(email, password); + + var result = new LoginPageObject(_webDriver).GetResult(); + + result.Should().Be("Пользователь не найден"); + } + + [Test] + public void LoginWithIncorrectPasswordTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + var incorrectPassword = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .SignOff() + .MoveToLogin() + .Login(email, incorrectPassword); + + var result = new LoginPageObject(_webDriver).GetResult(); + + result.Should().Be("Неправильный логин или пароль"); + } + + [Test] + public void EditAccountDataTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + var newName = GenerateString(); + var newSurname = GenerateString(); + var newMiddleName = GenerateString(); + + var profileData = mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .MoveToEditProfile() + .EditProfile(newName, newSurname, password, newMiddleName, password) + .MoveToMenu() + .MoveToProfile() + .GetProfileData() + .Split(" "); + + profileData[0].Should().Be(newName); + profileData[1].Should().Be(newMiddleName); + profileData[2].Should().Be(newSurname); + } + + [Test] + public void EditPasswordTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + var newPassword = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .MoveToEditProfile() + .EditProfile(name, surname, password, middleName, newPassword) + .MoveToMenu() + .SignOff() + .MoveToLogin() + .Login(email, newPassword); + WaitUntil.WaitLocation(_webDriver, _url, 5); + var currentUrl = _webDriver.Url; + + currentUrl.Should().Be(_url); + } + + [Test] + public void EditAccountDataWithIncorrectCurrentPasswordTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + var newName = GenerateString(); + var newSurname = GenerateString(); + var newMiddleName = GenerateString(); + var newPassword = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .MoveToEditProfile() + .EditProfile(newName, newSurname, newPassword, newMiddleName, newPassword); + + var result = new EditProfilePageObject(_webDriver).GetResult(); + result.Should().Be("Неправильный логин или пароль"); + + var newMainMenu = new MainMenuPageObject(_webDriver); + + newMainMenu + .MoveToMenu() + .SignOff() + .MoveToLogin() + .Login(email, newPassword); + + var loginResult = new LoginPageObject(_webDriver).GetResult(); + loginResult.Should().Be("Неправильный логин или пароль"); + } + + [Test] + public void InviteNewLecturerTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .SignOff() + .MoveToLogin() + .Login("admin@gmail.com", "Admin@1234") + .MoveToMenu() + .MoveToInviteLecturer() + .InviteLecturer(email); + + var result = new InviteLecturerPageObject(_webDriver).GetSuccess(); + + result.Should().Be("Запрос отправлен"); + } + + [Test] + public void InviteOneLecturerTwoTimes() + { + var mainMenu = new MainMenuPageObject(_webDriver); + var name = GenerateString(); + var surname = GenerateString(); + var middleName = GenerateString(); + var email = GenerateEmail(); + var password = GenerateString(); + + mainMenu + .MoveToRegister() + .Register(name, surname, email, password, password, middleName) + .MoveToMenu() + .SignOff() + .MoveToLogin() + .Login("admin@gmail.com", "Admin@1234") + .MoveToMenu() + .MoveToInviteLecturer() + .InviteLecturer(email); + + var result = new InviteLecturerPageObject(_webDriver).GetSuccess(); + result.Should().Be("Запрос отправлен"); + + var inviteResult = new InviteLecturerPageObject(_webDriver) + .Close() + .MoveToMenu() + .MoveToInviteLecturer() + .InviteLecturer(email) + .GetError(); + + inviteResult.Should().Be("Некорректный адрес электронной почты."); + } + + [Test] + public void CheckProfileTest() + { + var mainMenu = new MainMenuPageObject(_webDriver); + + var profileData = mainMenu + .MoveToLogin() + .Login("admin@gmail.com", "Admin@1234") + .MoveToMenu() + .MoveToProfile() + .GetProfileData(); + + profileData.Should().Contain("admin@gmail.com"); + } + + [TearDown] + public void TearDown() + { + _webDriver.Quit(); + } + + private string GenerateString() + => new Fixture().Create().Substring(0, 6); + + private string GenerateEmail() + => new Fixture().Create().Address; + } +} diff --git a/HwProj.AuthService/HwProj.AuthService.SeleniumTests/HwProj.AuthService.SeleniumTests.csproj b/HwProj.AuthService/HwProj.AuthService.SeleniumTests/HwProj.AuthService.SeleniumTests.csproj new file mode 100644 index 000000000..aee53e131 --- /dev/null +++ b/HwProj.AuthService/HwProj.AuthService.SeleniumTests/HwProj.AuthService.SeleniumTests.csproj @@ -0,0 +1,23 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + + + + + diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/AppBarMenuPageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/AppBarMenuPageObject.cs new file mode 100644 index 000000000..2d32454ee --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/AppBarMenuPageObject.cs @@ -0,0 +1,50 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class AppBarMenuPageObject + { + private readonly IWebDriver _webDriver; + private ListElement InviteLecturerButton { get; } + private ListElement ProfileButton { get; } + private ListElement EditProfileButton { get; } + private ListElement SignOffButton { get; } + + public AppBarMenuPageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + ProfileButton = new ListElement(webDriver, "profile-button"); + InviteLecturerButton = new ListElement(webDriver, "invite-lecturer-button"); + EditProfileButton = new ListElement(webDriver, "edit-profile-button"); + SignOffButton = new ListElement(webDriver, "sign-off-button"); + } + + public ProfilePageObject MoveToProfile() + { + ProfileButton.Click(); + + return new ProfilePageObject(_webDriver); + } + + public InviteLecturerPageObject MoveToInviteLecturer() + { + InviteLecturerButton.Click(); + + return new InviteLecturerPageObject(_webDriver); + } + + public EditProfilePageObject MoveToEditProfile() + { + EditProfileButton.Click(); + + return new EditProfilePageObject(_webDriver); + } + + public MainMenuPageObject SignOff() + { + SignOffButton.Click(); + + return new MainMenuPageObject(_webDriver); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/EditProfilePageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/EditProfilePageObject.cs new file mode 100644 index 000000000..fa5354f08 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/EditProfilePageObject.cs @@ -0,0 +1,51 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class EditProfilePageObject + { + private readonly IWebDriver _webDriver; + private Input Name { get; } + private Input Surname { get; } + private Input MiddleName { get; } + private Input Password { get; } + private Input NewPassword { get; } + private Button EditButton { get; } + private Text Result { get; } + + public EditProfilePageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + Name = new Input(webDriver, "edit-name-input"); + Surname = new Input(webDriver, "edit-surname-input"); + MiddleName = new Input(webDriver, "edit-middle-name-input"); + Password = new Input(webDriver, "edit-password-input"); + NewPassword = new Input(webDriver, "edit-new-password-input"); + EditButton = new Button(webDriver, "complete-edit-profile-button"); + Result = new Text(webDriver, "edit-result"); + } + + public MainMenuPageObject EditProfile(string name, string surname, string password, string middleName = "", + string newPassword = "") + { + Name.SendKeys(name); + + Surname.SendKeys(surname); + + MiddleName.SendKeys(middleName); + + Password.SendKeys(password); + + NewPassword.SendKeys(newPassword); + + EditButton.Click(); + + return new MainMenuPageObject(_webDriver); + } + + public string GetResult() + { + return Result.GetText(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/InviteLecturerPageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/InviteLecturerPageObject.cs new file mode 100644 index 000000000..bec9178fe --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/InviteLecturerPageObject.cs @@ -0,0 +1,50 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class InviteLecturerPageObject + { + private readonly IWebDriver _webDriver; + private Input Email { get; } + private Button InviteButton { get; } + private Button CloseButton { get; } + private Text Success { get; } + private Text Error { get; } + + public InviteLecturerPageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + Email = new Input(webDriver, "invite-lecturer-email-input"); + InviteButton = new Button(webDriver, "invite-lecturer-button"); + CloseButton = new Button(webDriver, "close-invite-lecturer-form-button"); + Success = new Text(webDriver, "invite-lecturer-success"); + Error = new Text(webDriver, "invite-lecturer-error"); + } + + public InviteLecturerPageObject InviteLecturer(string email) + { + Email.Enter(email); + + InviteButton.Click(); + + return new InviteLecturerPageObject(_webDriver); + } + + public MainMenuPageObject Close() + { + CloseButton.Click(); + + return new MainMenuPageObject(_webDriver); + } + + public string GetSuccess() + { + return Success.GetText(); + } + + public string GetError() + { + return Error.GetText(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/LoginPageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/LoginPageObject.cs new file mode 100644 index 000000000..101404d16 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/LoginPageObject.cs @@ -0,0 +1,39 @@ +using System.Xml.XPath; +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class LoginPageObject + { + private readonly IWebDriver _webDriver; + private Input Email { get; } + private Input Password { get; } + private Button LoginButton { get; } + private Text Result { get; } + + public LoginPageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + Email = new Input(webDriver, "login-email-input"); + Password = new Input(webDriver, "login-password-input"); + LoginButton = new Button(webDriver, "login-button"); + Result = new Text(webDriver, "login-result"); + } + + public MainMenuPageObject Login(string email, string password) + { + Email.SendKeys(email); + + Password.SendKeys(password); + + LoginButton.Click(); + + return new MainMenuPageObject(_webDriver); + } + + public string GetResult() + { + return Result.GetText(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/MainMenuPageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/MainMenuPageObject.cs new file mode 100644 index 000000000..eddf31c82 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/MainMenuPageObject.cs @@ -0,0 +1,42 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class MainMenuPageObject + { + private readonly IWebDriver _webDriver; + private Button SignInButton { get; } + private Button SignUpButton { get; } + private Button MenuButton { get; } + + + public MainMenuPageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + SignInButton = new Button(webDriver, "sign-in-button"); + SignUpButton = new Button(webDriver, "sign-up-button"); + MenuButton = new Button(webDriver, "menu-button"); + } + + public LoginPageObject MoveToLogin() + { + SignInButton.Click(); + + return new LoginPageObject(_webDriver); + } + + public RegisterPageObject MoveToRegister() + { + SignUpButton.Click(); + + return new RegisterPageObject(_webDriver); + } + + public AppBarMenuPageObject MoveToMenu() + { + MenuButton.Click(); + + return new AppBarMenuPageObject(_webDriver); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/ProfilePageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/ProfilePageObject.cs new file mode 100644 index 000000000..90d53f143 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/ProfilePageObject.cs @@ -0,0 +1,24 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class ProfilePageObject + { + private readonly IWebDriver _webDriver; + + private Text FullName { get; } + private Text Email { get; } + + public ProfilePageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + FullName = new Text(webDriver, "full-name-text"); + Email = new Text(webDriver, "email-text"); + } + + public string GetProfileData() + { + return FullName.GetText() + " " + Email.GetText(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/RegisterPageObject.cs b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/RegisterPageObject.cs new file mode 100644 index 000000000..3203c1722 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/AuthServicePageObjects/RegisterPageObject.cs @@ -0,0 +1,55 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects.AuthServicePageObjects +{ + public class RegisterPageObject + { + private readonly IWebDriver _webDriver; + private Input Name { get; } + private Input Surname { get; } + private Input MiddleName { get; } + private Input Email { get; } + private Input Password { get; } + private Input ConfirmPassword { get; } + private Button RegisterButton { get; } + private Text Result { get; } + + public RegisterPageObject(IWebDriver webDriver) + { + _webDriver = webDriver; + Name = new Input(webDriver, "register-name-input"); + Surname = new Input(webDriver, "register-surname-input"); + MiddleName = new Input(webDriver, "register-middle-name-input"); + Email = new Input(webDriver, "register-email-input"); + Password = new Input(webDriver, "register-password-input"); + ConfirmPassword = new Input(webDriver, "register-confirm-password-input"); + RegisterButton = new Button(webDriver, "register-button"); + Result = new Text(webDriver, "register-result"); + } + + public MainMenuPageObject Register(string name, string surname, string email, string password, + string confirmPassword, string middleName = "") + { + Name.SendKeys(name); + + Surname.SendKeys(surname); + + MiddleName.SendKeys(middleName); + + Email.SendKeys(email); + + Password.SendKeys(password); + + ConfirmPassword.SendKeys(confirmPassword); + + RegisterButton.Click(); + + return new MainMenuPageObject(_webDriver); + } + + public string GetResult() + { + return Result.GetText(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/Button.cs b/HwProj.Common/HwProj.PageObjects/Button.cs new file mode 100644 index 000000000..0a65f2e99 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/Button.cs @@ -0,0 +1,26 @@ +using System.Threading; +using OpenQA.Selenium; + +namespace HwProj.PageObjects +{ + public class Button + { + private By Element { get; } + private readonly IWebDriver _webDriver; + + public Button(IWebDriver webDriver, string id) + { + _webDriver = webDriver; + Element = By.XPath($"//button[@id='{id}']"); + } + + public void Click() + { + WaitUntil.WaitElement(_webDriver, Element, 5); + + _webDriver + .FindElement(Element) + .Click(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/HwProj.PageObjects.csproj b/HwProj.Common/HwProj.PageObjects/HwProj.PageObjects.csproj new file mode 100644 index 000000000..3d8dbe610 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/HwProj.PageObjects.csproj @@ -0,0 +1,12 @@ + + + + netstandard2.0 + + + + + + + + diff --git a/HwProj.Common/HwProj.PageObjects/Input.cs b/HwProj.Common/HwProj.PageObjects/Input.cs new file mode 100644 index 000000000..c704d839e --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/Input.cs @@ -0,0 +1,49 @@ +using System; +using System.Linq; +using OpenQA.Selenium; +using OpenQA.Selenium.Support.UI; + +namespace HwProj.PageObjects +{ + public class Input + { + private By Element { get; } + private readonly IWebDriver _webDriver; + + public Input(IWebDriver webDriver, string id) + { + _webDriver = webDriver; + Element = By.XPath($"//input[@id='{id}']"); + } + + public void SendKeys(string text) + { + WaitUntil.WaitElement(_webDriver, Element, 5); + + _webDriver + .FindElement(Element) + .SendKeys(Keys.LeftShift + Keys.Home); + + WaitUntil.WaitElement(_webDriver, Element, 5); + + _webDriver + .FindElement(Element) + .SendKeys(text); + } + + public void Enter(string text) + { + WaitUntil.WaitElement(_webDriver, Element, 5); + + _webDriver + .FindElement(Element) + .SendKeys(Keys.LeftShift + Keys.Home); + + WaitUntil.WaitElement(_webDriver, Element, 5); + + _webDriver + .FindElement(Element) + .SendKeys(text + Keys.ArrowDown + Keys.Enter); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/ListElement.cs b/HwProj.Common/HwProj.PageObjects/ListElement.cs new file mode 100644 index 000000000..65118a7af --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/ListElement.cs @@ -0,0 +1,25 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects +{ + public class ListElement + { + private By Element { get; } + private readonly IWebDriver _webDriver; + + public ListElement(IWebDriver webDriver, string id) + { + _webDriver = webDriver; + Element = By.XPath($"//li[@id='{id}']"); + } + + public void Click() + { + WaitUntil.WaitElement(_webDriver, Element, 5); + + _webDriver + .FindElement(Element) + .Click(); + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/Text.cs b/HwProj.Common/HwProj.PageObjects/Text.cs new file mode 100644 index 000000000..7205c9580 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/Text.cs @@ -0,0 +1,23 @@ +using OpenQA.Selenium; + +namespace HwProj.PageObjects +{ + public class Text + { + private By Element { get; } + private readonly IWebDriver _webDriver; + + public Text(IWebDriver webDriver, string id) + { + _webDriver = webDriver; + Element = By.XPath($"//p[@id='{id}']"); + } + + public string GetText() + { + WaitUntil.WaitElement(_webDriver, Element, 5); + + return _webDriver.FindElement(Element).Text; + } + } +} diff --git a/HwProj.Common/HwProj.PageObjects/WaitUntil.cs b/HwProj.Common/HwProj.PageObjects/WaitUntil.cs new file mode 100644 index 000000000..bcb455d81 --- /dev/null +++ b/HwProj.Common/HwProj.PageObjects/WaitUntil.cs @@ -0,0 +1,21 @@ +using System; +using OpenQA.Selenium; +using OpenQA.Selenium.Support.UI; + +namespace HwProj.PageObjects +{ + public static class WaitUntil + { + public static void WaitLocation(IWebDriver driver, string location, int time) + { + new WebDriverWait(driver, TimeSpan.FromSeconds(time)) + .Until(ExpectedConditions.UrlToBe(location)); + } + + public static void WaitElement(IWebDriver driver, By element, int time) + { + new WebDriverWait(driver, TimeSpan.FromSeconds(time)) + .Until(ExpectedConditions.ElementIsVisible(element)); + } + } +} diff --git a/HwProj.sln b/HwProj.sln index 786e01d33..32967f0fe 100644 --- a/HwProj.sln +++ b/HwProj.sln @@ -64,6 +64,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.SolutionsService.Cli EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.Exceptions", "HwProj.Common\HwProj.Exceptions\HwProj.Exceptions.csproj", "{51463655-7668-4C7D-9FDE-D4D7CDAA82B8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.AuthService.SeleniumTests", "HwProj.AuthService\HwProj.AuthService.SeleniumTests\HwProj.AuthService.SeleniumTests.csproj", "{65B56526-A460-4BB3-AC2D-CF72A71292C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.PageObjects", "HwProj.Common\HwProj.PageObjects\HwProj.PageObjects.csproj", "{BF150B19-4E2A-4D8F-B1D7-930CDECC14AD}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.AuthService.IntegrationTests", "HwProj.AuthService\HwProj.AuthService.IntegrationTests\HwProj.AuthService.IntegrationTests.csproj", "{EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}" EndProject Global @@ -156,6 +160,14 @@ Global {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Release|Any CPU.Build.0 = Release|Any CPU + {65B56526-A460-4BB3-AC2D-CF72A71292C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65B56526-A460-4BB3-AC2D-CF72A71292C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65B56526-A460-4BB3-AC2D-CF72A71292C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65B56526-A460-4BB3-AC2D-CF72A71292C0}.Release|Any CPU.Build.0 = Release|Any CPU + {BF150B19-4E2A-4D8F-B1D7-930CDECC14AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF150B19-4E2A-4D8F-B1D7-930CDECC14AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF150B19-4E2A-4D8F-B1D7-930CDECC14AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF150B19-4E2A-4D8F-B1D7-930CDECC14AD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -171,6 +183,7 @@ Global {2B4D695D-1BAA-4BCC-AE5A-C1CDD4ACCCCA} = {1EAEB779-E7C8-4EF9-B9A9-22CB8E3C246D} {7ECE830B-68EA-4BA3-BDEC-0D1E9FACB19A} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} {1407B364-9938-42C3-B061-30BE3F96FE02} = {DC0D1EE7-D2F8-4D15-8CC6-69A0A0A938D9} + {34A014AB-BC00-4AFF-B08F-D8280734C869} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} {ECFA80DA-E0F5-4613-A15E-55FC8B9C8401} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} {8F56C068-4827-412F-A29A-419B8AC5BECD} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} {0A9B7E03-680B-4BAC-9599-87AB5219D376} = {CB37F9AC-88CB-425C-8200-1B40F372F38D} @@ -182,6 +195,8 @@ Global {C1ACAB32-4100-4C19-AE08-57FA9BA75DF2} = {A85A3030-2878-4923-B450-9683832CDAC1} {51463655-7668-4C7D-9FDE-D4D7CDAA82B8} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} + {65B56526-A460-4BB3-AC2D-CF72A71292C0} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} + {BF150B19-4E2A-4D8F-B1D7-930CDECC14AD} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C03BF138-4A5B-4261-9495-6D3AC6CE9779} diff --git a/hwproj.front/src/components/AppBar.tsx b/hwproj.front/src/components/AppBar.tsx index 4b4852b54..393b967b7 100644 --- a/hwproj.front/src/components/AppBar.tsx +++ b/hwproj.front/src/components/AppBar.tsx @@ -77,6 +77,7 @@ export const Header: React.FC = (props: AppBarProps) => { (
= (props: AppBarProps) => { open={Boolean(anchorEl)} onClose={handleClose} > - + Пригласить преподавателя - window.location.assign("/create_course")}> + window.location.assign("/create_course")} + > Создать курс - window.location.assign("/profile")}> + window.location.assign("/profile")} + > Профиль - window.location.assign("/user/edit")}> + window.location.assign("/user/edit")} + > Редактировать данные - + Выйти @@ -112,6 +128,7 @@ export const Header: React.FC = (props: AppBarProps) => { {props.loggedIn && !props.isLecturer && (
= (props: AppBarProps) => { open={Boolean(anchorEl)} onClose={handleClose} > - window.location.assign("/profile")}> + window.location.assign("/profile")} + > Профиль - window.location.assign("/user/edit")}> + window.location.assign("/user/edit")} + > Редактировать данные - + Выйти @@ -141,6 +167,7 @@ export const Header: React.FC = (props: AppBarProps) => { {!props.loggedIn && (
window.location.assign("/login")} component="button" color="inherit" @@ -150,6 +177,7 @@ export const Header: React.FC = (props: AppBarProps) => { Вход window.location.assign("/register")} component="button" color="inherit" diff --git a/hwproj.front/src/components/Auth/Login.tsx b/hwproj.front/src/components/Auth/Login.tsx index f53d8c72b..e54080c0d 100644 --- a/hwproj.front/src/components/Auth/Login.tsx +++ b/hwproj.front/src/components/Auth/Login.tsx @@ -136,7 +136,7 @@ const Login: FC = (props) => { Войти {loginState.error && ( -

+

{loginState.error}

)} @@ -145,6 +145,7 @@ const Login: FC = (props) => { = (props) => { = (props) => {