From cd4f66e7c554cc6a78b7b30fba35246feef19b60 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 25 Apr 2013 06:10:57 -0200 Subject: [PATCH] Making a start on adding Selenium integration/UI tests for the backoffice --- .../Initial/DatabaseSchemaCreation.cs | 33 +++- .../Integration/CreateContent.cs | 155 ++++++++++++++++++ .../Integration/InstallPackage.cs | 145 ++++++++++++++++ .../TestHelpers/BaseSeleniumTest.cs | 151 +++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 8 + src/Umbraco.Tests/packages.config | 1 + src/packages/repositories.config | 1 + tools/ConfigTransformTool/ctt.exe | Bin 0 -> 92160 bytes tools/ConfigTransformTool/readme.txt | 2 + 9 files changed, 492 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Tests/Integration/CreateContent.cs create mode 100644 src/Umbraco.Tests/Integration/InstallPackage.cs create mode 100644 src/Umbraco.Tests/TestHelpers/BaseSeleniumTest.cs create mode 100644 tools/ConfigTransformTool/ctt.exe create mode 100644 tools/ConfigTransformTool/readme.txt diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs index 7d9d59c08c..c501e965ae 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using Umbraco.Core.Events; +using Umbraco.Core.Logging; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.SqlSyntax; @@ -54,15 +55,39 @@ namespace Umbraco.Core.Persistence.Migrations.Initial {34, typeof (TaskTypeDto)}, {35, typeof (TaskDto)}, {36, typeof (ContentType2ContentTypeDto)}, - { - 37, - typeof (ContentTypeAllowedContentTypeDto) - }, + {37, typeof (ContentTypeAllowedContentTypeDto)}, {38, typeof (User2AppDto)}, {39, typeof (User2NodeNotifyDto)}, {40, typeof (User2NodePermissionDto)} }; #endregion + /// + /// Drops all Umbraco tables in the db + /// + internal void UninstallDatabaseSchema() + { + LogHelper.Info("Start UninstallDatabaseSchema"); + + foreach (var item in OrderedTables.OrderByDescending(x => x.Key)) + { + var tableNameAttribute = item.Value.FirstAttribute(); + + string tableName = tableNameAttribute == null ? item.Value.Name : tableNameAttribute.Value; + + LogHelper.Info("Uninstall" + tableName); + + try + { + _database.DropTable(tableName); + } + catch (Exception ex) + { + //swallow this for now, not sure how best to handle this with diff databases... though this is internal + // and only used for unit tests. If this fails its because the table doesn't exist... generally! + LogHelper.Error("Could not drop table " + tableName, ex); + } + } + } public DatabaseSchemaCreation(Database database) { diff --git a/src/Umbraco.Tests/Integration/CreateContent.cs b/src/Umbraco.Tests/Integration/CreateContent.cs new file mode 100644 index 0000000000..c4164cc3ca --- /dev/null +++ b/src/Umbraco.Tests/Integration/CreateContent.cs @@ -0,0 +1,155 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading; +using NUnit.Framework; +using OpenQA.Selenium; +using OpenQA.Selenium.Interactions; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Integration +{ + [Ignore("We don't want to run Selenium tests on TeamCity")] + [TestFixture] + public class CreateContent : BaseSeleniumTest + { + [SetUp] + public override void Initialize() + { + base.Initialize(); + } + + [TearDown] + public void TearDown() + { + base.TearDown(); + } + + [Test] + public void Install_StarterKit_And_Create_Textpage() + { + // Login to Umbraco + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/login.aspx?redir="); + Driver.FindElement(By.Id("lname")).Clear(); + Driver.FindElement(By.Id("lname")).SendKeys("admin"); + Driver.FindElement(By.Id("passw")).Clear(); + Driver.FindElement(By.Id("passw")).SendKeys("test"); + Driver.FindElement(By.Id("Button1")).Click(); + Thread.Sleep(500); + + // Install starter kit + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/umbraco.aspx#developer"); + Thread.Sleep(2000); + + var builder = new Actions(Driver); + var packagesNode = Driver.FindElement(By.XPath("//*[@id='init'][3]")); + builder.MoveToElement(packagesNode).DoubleClick().Build().Perform(); + Thread.Sleep(500); + + var installStarterKitNode = Driver.FindElement(By.XPath("(//li[@id='-1']/a/div)[4]")); + builder.MoveToElement(installStarterKitNode).Click().Build().Perform(); + Thread.Sleep(500); + + var rightFrame = Driver.FindElement(By.XPath("//*[@id='right']")); + Driver.SwitchTo().Frame(rightFrame); + Thread.Sleep(500); + + var simpleKit = Driver.FindElement(By.XPath("/html/body/form/div[2]/div[2]/div/div/div/div/div[4]/nav/ul/li[1]/a")); + builder.MoveToElement(simpleKit).Click().Build().Perform(); + Thread.Sleep(6000); + + // Create new content + Driver.SwitchTo().DefaultContent(); + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/umbraco.aspx#content"); + Thread.Sleep(500); + + var contentNode = Driver.FindElement(By.XPath("//*[@id = 'JTree_TreeContainer']/div/ul/li/ul/li/a/div")); + builder.MoveToElement(contentNode).ContextClick().Build().Perform(); + Thread.Sleep(1000); + + var createButton = Driver.FindElement(By.XPath("//*[@id = 'jstree-contextmenu']/li[1]/a/span/div[2]")); + createButton.Click(); + Thread.Sleep(500); + + var umbracoModalBoxIframe = Driver.FindElement(By.CssSelector(".umbModalBoxIframe")); + Driver.SwitchTo().Frame(umbracoModalBoxIframe); + + var createTextBox = Driver.FindElement(By.XPath("//input[@type='text'][1]")); + createTextBox.Clear(); + createTextBox.SendKeys("Test Page"); + + var submitButton = Driver.FindElement(By.XPath("//input[@type='submit'][1]")); + submitButton.Click(); + Thread.Sleep(2000); + + Driver.SwitchTo().Frame(rightFrame); + var saveAndPublishButton = Driver.FindElement(By.XPath("//*[@id='body_TabView1_tab01layer_publish']")); + saveAndPublishButton.Click(); + Thread.Sleep(2000); + + var contentArea = Driver.FindElement(By.XPath("//*[@id='body_TabView1']")); + Assert.IsNotNull(contentArea); + Thread.Sleep(500); + + // Perform delete + Driver.SwitchTo().DefaultContent(); + var installingModulesNode = Driver.FindElement(By.XPath("//*[@id='1052']/a/div")); + builder.MoveToElement(installingModulesNode).ContextClick().Build().Perform(); + Thread.Sleep(1000); + + var deleteButton = Driver.FindElement(By.CssSelector(".sprDelete")); + deleteButton.Click(); + var alert = Driver.SwitchTo().Alert(); + alert.Accept(); + Thread.Sleep(1000); + + // Perform move + var goFurtherNode = Driver.FindElement(By.XPath("//*[@id='1053']/a/div")); + builder.MoveToElement(goFurtherNode).ContextClick().Build().Perform(); + Thread.Sleep(1000); + + var moveButton = Driver.FindElement(By.CssSelector(".sprMove")); + moveButton.Click(); + Thread.Sleep(2000); + + umbracoModalBoxIframe = Driver.FindElement(By.CssSelector(".umbModalBoxIframe")); + Driver.SwitchTo().Frame(umbracoModalBoxIframe); + + var rootNode = Driver.FindElement(By.XPath("//*[@id='1051']")); + builder.MoveToElement(rootNode).DoubleClick().Build().Perform(); + Thread.Sleep(500); + var gettinStartedNode = Driver.FindElement(By.XPath("//*[@id='1055']/a/div")); + builder.MoveToElement(gettinStartedNode).Click().Build().Perform(); + Thread.Sleep(500); + submitButton = Driver.FindElement(By.XPath("//input[@type='submit'][1]")); + builder.MoveToElement(submitButton).Click().Build().Perform(); + Thread.Sleep(2000); + var closeLink = Driver.FindElement(By.XPath("/html/body/form/div[2]/p[2]/a")); + builder.MoveToElement(closeLink).Click().Build().Perform(); + + Driver.SwitchTo().DefaultContent(); + Thread.Sleep(1000); + + // Perform copy + var gettingStartedNode = Driver.FindElement(By.XPath("//*[@id='1054']/a/div")); + builder.MoveToElement(gettingStartedNode).ContextClick().Build().Perform(); + Thread.Sleep(1000); + + var copyButton = Driver.FindElement(By.CssSelector(".sprCopy")); + copyButton.Click(); + Thread.Sleep(2000); + + umbracoModalBoxIframe = Driver.FindElement(By.CssSelector(".umbModalBoxIframe")); + Driver.SwitchTo().Frame(umbracoModalBoxIframe); + + rootNode = Driver.FindElement(By.XPath("//*[@id='1051']")); + builder.MoveToElement(rootNode).DoubleClick().Build().Perform(); + Thread.Sleep(500); + + submitButton = Driver.FindElement(By.XPath("//input[@type='submit'][1]")); + builder.MoveToElement(submitButton).Click().Build().Perform(); + Thread.Sleep(2000); + closeLink = Driver.FindElement(By.XPath("/html/body/form/div[2]/p[2]/a")); + builder.MoveToElement(closeLink).Click().Build().Perform(); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Integration/InstallPackage.cs b/src/Umbraco.Tests/Integration/InstallPackage.cs new file mode 100644 index 0000000000..2a98ac2fb8 --- /dev/null +++ b/src/Umbraco.Tests/Integration/InstallPackage.cs @@ -0,0 +1,145 @@ +using System.IO; +using System.Linq; +using System.Threading; +using NUnit.Framework; +using OpenQA.Selenium; +using OpenQA.Selenium.Interactions; +using Umbraco.Core; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Integration +{ + [Ignore("We don't want to run Selenium tests on TeamCity")] + [TestFixture] + public class InstallPackage : BaseSeleniumTest + { + [SetUp] + public override void Initialize() + { + base.Initialize(); + } + + [TearDown] + public void TearDown() + { + base.TearDown(); + } + + [Test] + public void Install_Courier_Package() + { + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/login.aspx?redir="); + Driver.FindElement(By.Id("lname")).Clear(); + Driver.FindElement(By.Id("lname")).SendKeys("admin"); + Driver.FindElement(By.Id("passw")).Clear(); + Driver.FindElement(By.Id("passw")).SendKeys("test"); + Driver.FindElement(By.Id("Button1")).Click(); + Thread.Sleep(1000); + + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/umbraco.aspx#developer"); + Thread.Sleep(2000); + + var builder = new Actions(Driver); + var packagesNode = Driver.FindElement(By.XPath("//*[@id='init'][3]")); + builder.MoveToElement(packagesNode).DoubleClick().Build().Perform(); + Thread.Sleep(1000); + + var installPackageNode = Driver.FindElement(By.XPath("/html/body/div[2]/div/div/div[2]/div/div/div/div/ul/li/ul/li[3]/ul/li[4]/a/div")); + builder.MoveToElement(installPackageNode).Click().Build().Perform(); + Thread.Sleep(1000); + + var rightFrame = Driver.FindElement(By.XPath("//*[@id='right']")); + Driver.SwitchTo().Frame(rightFrame); + + const string packagesDir = @"C:\\Downloads\\Packages\\"; + var file = new DirectoryInfo(packagesDir).GetFiles().First(f => f.Name.ToLowerInvariant().StartsWith("Courier".ToLowerInvariant())); + + Driver.FindElement(By.Id("cb")).Click(); + Driver.FindElement(By.XPath("//input[@type='file']")).SendKeys(file.FullName); + Driver.FindElement(By.Id("body_ButtonLoadPackage")).Click(); + Driver.FindElement(By.Id("body_acceptCheckbox")).Click(); + Driver.FindElement(By.Id("body_ButtonInstall")).Click(); + Thread.Sleep(1000); + + var successPanel = Driver.FindElement(By.XPath("//*[@id='body_Panel1_content']")); + Assert.IsNotNull(successPanel); + } + + [Test] + public void Install_Contour_Package() + { + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/login.aspx?redir="); + Driver.FindElement(By.Id("lname")).Clear(); + Driver.FindElement(By.Id("lname")).SendKeys("admin"); + Driver.FindElement(By.Id("passw")).Clear(); + Driver.FindElement(By.Id("passw")).SendKeys("test"); + Driver.FindElement(By.Id("Button1")).Click(); + Thread.Sleep(1000); + + Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/umbraco.aspx#developer"); + Thread.Sleep(2000); + + var builder = new Actions(Driver); + var packagesNode = Driver.FindElement(By.XPath("//*[@id='init'][3]")); + builder.MoveToElement(packagesNode).DoubleClick().Build().Perform(); + Thread.Sleep(1000); + + var installPackageNode = Driver.FindElement(By.XPath("/html/body/div[2]/div/div/div[2]/div/div/div/div/ul/li/ul/li[3]/ul/li[4]/a/div")); + builder.MoveToElement(installPackageNode).Click().Build().Perform(); + Thread.Sleep(1000); + + var rightFrame = Driver.FindElement(By.XPath("//*[@id='right']")); + Driver.SwitchTo().Frame(rightFrame); + + const string packagesDir = @"C:\\Downloads\\Packages\\"; + var file = new DirectoryInfo(packagesDir).GetFiles().First(f => f.Name.ToLowerInvariant().StartsWith("UmbracoContour".ToLowerInvariant())); + + Driver.FindElement(By.Id("cb")).Click(); + Driver.FindElement(By.Id("body_file1")).SendKeys(file.Name); + Driver.FindElement(By.Id("body_ButtonLoadPackage")).Click(); + Driver.FindElement(By.Id("body_acceptCheckbox")).Click(); + Driver.FindElement(By.Id("body_ButtonInstall")).Click(); + Thread.Sleep(1000); + + var successPanel = Driver.FindElement(By.XPath("//*[@id='body_Panel1_content']")); + Assert.IsNotNull(successPanel); + } + + //[Test] + //public void Install_CMS_Import_Package() + //{ + // Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/login.aspx?redir="); + // Driver.FindElement(By.Id("lname")).Clear(); + // Driver.FindElement(By.Id("lname")).SendKeys("admin"); + // Driver.FindElement(By.Id("passw")).Clear(); + // Driver.FindElement(By.Id("passw")).SendKeys("test"); + // Driver.FindElement(By.Id("Button1")).Click(); + // Thread.Sleep(1000); + + // Driver.Navigate().GoToUrl(BaseUrl + "/umbraco/umbraco.aspx#developer"); + // Thread.Sleep(2000); + + // var builder = new Actions(Driver); + // var packagesNode = Driver.FindElement(By.XPath("//*[@id='init'][3]")); + // builder.MoveToElement(packagesNode).DoubleClick().Build().Perform(); + // Thread.Sleep(1000); + + // var installPackageNode = Driver.FindElement(By.XPath("/html/body/div[2]/div/div/div[2]/div/div/div/div/ul/li/ul/li[3]/ul/li[4]/a/div")); + // builder.MoveToElement(installPackageNode).Click().Build().Perform(); + // Thread.Sleep(1000); + + // var rightFrame = Driver.FindElement(By.XPath("//*[@id='right']")); + // Driver.SwitchTo().Frame(rightFrame); + + // Driver.FindElement(By.Id("cb")).Click(); + // Driver.FindElement(By.Id("body_file1")).SendKeys("C:\\Downloads\\Packages\\CMSImport-2.3.1.zip"); + // Driver.FindElement(By.Id("body_ButtonLoadPackage")).Click(); + // Driver.FindElement(By.Id("body_acceptCheckbox")).Click(); + // Driver.FindElement(By.Id("body_ButtonInstall")).Click(); + // Thread.Sleep(1000); + + // var successPanel = Driver.FindElement(By.XPath("//*[@id='body_Panel1_content']")); + // Assert.IsNotNull(successPanel); + //} + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseSeleniumTest.cs b/src/Umbraco.Tests/TestHelpers/BaseSeleniumTest.cs new file mode 100644 index 0000000000..832dde1e70 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/BaseSeleniumTest.cs @@ -0,0 +1,151 @@ +using System; +using System.Data.SqlServerCe; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Linq.Dynamic; +using System.Runtime.InteropServices; +using System.Text; +using System.Web.Management; +using NUnit.Framework; +using OpenQA.Selenium; +using OpenQA.Selenium.Firefox; +using Umbraco.Core; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Migrations.Initial; +using Umbraco.Core.Persistence.SqlSyntax; + +namespace Umbraco.Tests.TestHelpers +{ + public class BaseSeleniumTest + { + internal IWebDriver Driver; + internal string BaseUrl; + + private StringBuilder _verificationErrors; + private UmbracoDatabase _database; + + protected ApplicationContext ApplicationContext + { + get { return ApplicationContext.Current; } + } + + [SetUp] + public virtual void Initialize() + { + + // Disable medium trust + var transform = TransformWebConfig("Release"); + + var assemblyPath = TestHelper.CurrentAssemblyDirectory; + assemblyPath = Path.Combine(assemblyPath, @"..\..\..\Umbraco.Web.UI\"); + var webUiPath = Path.GetFullPath(new Uri(assemblyPath).LocalPath); + + var installedPackagesConfig = string.Format("{0}App_Data\\packages\\installed\\installedPackages.config", webUiPath); + if (File.Exists(installedPackagesConfig)) + File.Delete(installedPackagesConfig); + + var databaseDataPath = string.Format(@"{0}\App_Data\Umbraco.sdf", webUiPath); + var connectionString = string.Format(@"Data Source={0}", databaseDataPath); + + //Create the Sql CE database + var engine = new SqlCeEngine(connectionString); + if (File.Exists(databaseDataPath) == false) + engine.CreateDatabase(); + + SqlSyntaxContext.SqlSyntaxProvider = new SqlCeSyntaxProvider(); + + _database = new UmbracoDatabase(connectionString, "System.Data.SqlServerCe.4.0"); + + // First remove anything in the database + var creation = new DatabaseSchemaCreation(_database); + creation.UninstallDatabaseSchema(); + + // Then populate it with fresh data + _database.CreateDatabaseSchema(false); + + _database.Execute("UPDATE umbracoUser SET userName = 'admin', userPassword = 'W477AMlLwwJQeAGlPZKiEILr8TA=', userEmail = 'none' WHERE id = 0"); // password: test + + // Recycle app pool so the new user can log in + //var webConfigFilePath = string.Format(@"{0}\web.config", webUiPath); + //File.SetLastWriteTime(webConfigFilePath, DateTime.Now); + + // Disable medium trust + transform = TransformWebConfig("Release"); + + Driver = new FirefoxDriver(); + BaseUrl = "http://localhost:61639/"; + _verificationErrors = new StringBuilder(); + } + + [TearDown] + public virtual void TearDown() + { + try + { + Driver.Quit(); + } + catch (Exception) + { + // Ignore errors if unable to close the browser + } + + // Re-enable medium trust + var transform = TransformWebConfig("Debug"); + + Assert.AreEqual("", _verificationErrors.ToString()); + } + + private static string TransformWebConfig(string configurationToUse) + { + var assemblyPath = TestHelper.CurrentAssemblyDirectory; + var toolsPath = Path.Combine(assemblyPath, @"..\..\..\..\tools\ConfigTransformTool\"); + var webUiPath = Path.GetFullPath(new Uri(Path.Combine(assemblyPath, @"..\..\..\Umbraco.Web.UI\")).LocalPath); + + var fileToTransform = webUiPath + "web.config"; + var transformFile = string.Format("{0}web.Template.{1}.config", webUiPath, configurationToUse); + + var psi = new ProcessStartInfo(string.Format("{0}ctt.exe", toolsPath), string.Format("s:\"{0}\" t:\"{1}\" d:\"{2}\" pw v", fileToTransform, transformFile, fileToTransform)) + { + WorkingDirectory = Environment.CurrentDirectory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + string[] result = {string.Empty}; + using (var process = new Process { StartInfo = psi }) + { + // delegate for writing the process output to the response output + Action dataReceived = ((sender, e) => + { + if (e.Data != null) // sometimes a random event is received with null data, not sure why - I prefer to leave it out + { + result[0] += e.Data; + result[0] += "\r\n"; + } + }); + + process.OutputDataReceived += new DataReceivedEventHandler(dataReceived); + process.ErrorDataReceived += new DataReceivedEventHandler(dataReceived); + + // start the process and start reading the standard and error outputs + process.Start(); + process.BeginErrorReadLine(); + process.BeginOutputReadLine(); + + // wait for the process to exit + process.WaitForExit(); + + // an exit code other than 0 generally means an error + if (process.ExitCode != 0) + { + result[0] = result[0] + "\r\n - Exited with exitcode " + process.ExitCode; + } + } + + return result[0]; + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 150f3f78f2..25a2cc9bed 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -86,6 +86,7 @@ True ..\packages\SqlServerCE.4.0.0.0\lib\System.Data.SqlServerCe.Entity.dll + @@ -121,6 +122,9 @@ False ..\packages\UmbracoExamine.0.1.42.2941\lib\UmbracoExamine.dll + + ..\packages\Selenium.WebDriver.2.32.0\lib\net40\WebDriver.dll + @@ -160,6 +164,9 @@ + + + @@ -436,6 +443,7 @@ + xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\amd64\*.* "$(TargetDir)amd64\" /Y /F /E /D diff --git a/src/Umbraco.Tests/packages.config b/src/Umbraco.Tests/packages.config index 615a16cf25..de5e0578aa 100644 --- a/src/Umbraco.Tests/packages.config +++ b/src/Umbraco.Tests/packages.config @@ -9,6 +9,7 @@ + diff --git a/src/packages/repositories.config b/src/packages/repositories.config index f811520cac..6ee58aadf0 100644 --- a/src/packages/repositories.config +++ b/src/packages/repositories.config @@ -9,6 +9,7 @@ + diff --git a/tools/ConfigTransformTool/ctt.exe b/tools/ConfigTransformTool/ctt.exe new file mode 100644 index 0000000000000000000000000000000000000000..e6089d27ac64e9f3e0a8f41c22eda397737a3f0e GIT binary patch literal 92160 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

LSDNoJcLeyP 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