/src/AddIns/Misc/PackageManagement/Test/Src/UpdateSolutionPackagesActionTests.cs

https://github.com/ajadex/SharpDevelop · C# · 342 lines · 262 code · 63 blank · 17 comment · 0 complexity · e8db8a6b80a44cac8a8f2d848e3e31a3 MD5 · raw file

  1. // Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4. // software and associated documentation files (the "Software"), to deal in the Software
  5. // without restriction, including without limitation the rights to use, copy, modify, merge,
  6. // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7. // to whom the Software is furnished to do so, subject to the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be included in all copies or
  10. // substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  13. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  14. // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  15. // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  16. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  17. // DEALINGS IN THE SOFTWARE.
  18. using System;
  19. using System.Collections.Generic;
  20. using ICSharpCode.PackageManagement;
  21. using ICSharpCode.PackageManagement.Scripting;
  22. using NuGet;
  23. using NUnit.Framework;
  24. using PackageManagement.Tests.Helpers;
  25. using Rhino.Mocks;
  26. namespace PackageManagement.Tests
  27. {
  28. [TestFixture]
  29. public class UpdateSolutionPackagesActionTests
  30. {
  31. TestableUpdateSolutionPackagesAction action;
  32. IPackageManagementSolution solution;
  33. List<IPackageManagementProject> projects;
  34. IPackageRepository sourceRepository;
  35. IPackageManagementEvents packageEvents;
  36. void CreateAction()
  37. {
  38. CreateSolution();
  39. packageEvents = MockRepository.GenerateStub<IPackageManagementEvents>();
  40. action = new TestableUpdateSolutionPackagesAction(solution, packageEvents);
  41. }
  42. void CreateActionWithOperations(params PackageOperation[] operations)
  43. {
  44. CreateAction();
  45. action.AddOperations(operations);
  46. }
  47. void CreateSolution()
  48. {
  49. projects = new List<IPackageManagementProject>();
  50. sourceRepository = MockRepository.GenerateStub<IPackageRepository>();
  51. solution = MockRepository.GenerateStub<IPackageManagementSolution>();
  52. solution
  53. .Stub(s => s.GetProjects(sourceRepository))
  54. .Return(projects);
  55. }
  56. IPackageFromRepository CreatePackage(string packageId, string version)
  57. {
  58. var package = MockRepository.GenerateStub<IPackageFromRepository>();
  59. package.Stub(p => p.Id).Return(packageId);
  60. package.Stub(p => p.Version).Return(new SemanticVersion(version));
  61. package.Stub(p => p.Repository).Return(sourceRepository);
  62. return package;
  63. }
  64. void ProjectHasOlderVersionOfPackage(IPackageManagementProject project, IPackageFromRepository package)
  65. {
  66. project.Stub(p => p.HasOlderPackageInstalled(package)).Return(true);
  67. }
  68. PackageOperation CreateInstallOperationWithFile(string fileName)
  69. {
  70. return PackageOperationHelper.CreateInstallOperationWithFile(fileName);
  71. }
  72. IPackageScriptRunner CreatePackageScriptRunner()
  73. {
  74. return MockRepository.GenerateStub<IPackageScriptRunner>();
  75. }
  76. IPackageManagementProject AddProjectToSolution()
  77. {
  78. IPackageManagementProject project = MockRepository.GenerateStub<IPackageManagementProject>();
  79. projects.Add(project);
  80. return project;
  81. }
  82. IPackageFromRepository AddPackageToAction(string packageId, string version)
  83. {
  84. IPackageFromRepository package = CreatePackage(packageId, version);
  85. action.AddPackages(new IPackageFromRepository[] { package });
  86. return package;
  87. }
  88. [Test]
  89. public void UpdateDependencies_DefaultValue_IsTrue()
  90. {
  91. CreateActionWithOperations();
  92. bool result = action.UpdateDependencies;
  93. Assert.IsTrue(result);
  94. }
  95. [Test]
  96. public void HasPackageScriptsToRun_PackageHasInitPowerShellScript_ReturnsTrue()
  97. {
  98. PackageOperation operation = CreateInstallOperationWithFile(@"tools\install.ps1");
  99. CreateActionWithOperations(operation);
  100. bool result = action.HasPackageScriptsToRun();
  101. Assert.IsTrue(result);
  102. }
  103. [Test]
  104. public void HasPackageScriptsToRun_PackageHasOneTextFile_ReturnsFalse()
  105. {
  106. PackageOperation operation = CreateInstallOperationWithFile(@"tools\readme.txt");
  107. CreateActionWithOperations(operation);
  108. bool result = action.HasPackageScriptsToRun();
  109. Assert.IsFalse(result);
  110. }
  111. [Test]
  112. public void Execute_OneProjectThatHasOlderVersionOfPackageBeingUpdated_PackageOperationsAreRun()
  113. {
  114. PackageOperation operation = CreateInstallOperationWithFile(@"tools\readme.txt");
  115. CreateActionWithOperations(operation);
  116. IPackageFromRepository package = AddPackageToAction("Test", "1.0");
  117. IPackageManagementProject project = AddProjectToSolution();
  118. var expectedOperations = new PackageOperation[] { operation };
  119. action.Execute();
  120. project.AssertWasCalled(p => p.RunPackageOperations(expectedOperations));
  121. }
  122. [Test]
  123. public void Execute_OneProjectThatHasOlderVersionOfPackageBeingUpdated_PackageReferenceUpdatedInProject()
  124. {
  125. CreateAction();
  126. IPackageFromRepository package = AddPackageToAction("Test", "1.0");
  127. IPackageManagementProject project = AddProjectToSolution();
  128. ProjectHasOlderVersionOfPackage(project, package);
  129. action.Execute();
  130. project.AssertWasCalled(p => p.UpdatePackageReference(package, action));
  131. }
  132. [Test]
  133. public void Execute_OneProjectThatHasOlderVersionsOfTwoPackagesBeingUpdated_PackageReferenceUpdatedInProjectForBothPackages()
  134. {
  135. CreateAction();
  136. IPackageFromRepository package1 = AddPackageToAction("A", "1.0");
  137. IPackageFromRepository package2 = AddPackageToAction("B", "1.0");
  138. IPackageManagementProject project = AddProjectToSolution();
  139. ProjectHasOlderVersionOfPackage(project, package1);
  140. ProjectHasOlderVersionOfPackage(project, package2);
  141. action.Execute();
  142. project.AssertWasCalled(p => p.UpdatePackageReference(package1, action));
  143. project.AssertWasCalled(p => p.UpdatePackageReference(package2, action));
  144. }
  145. [Test]
  146. public void Execute_TwoProjectsThatHaveOlderVersionsOfPackageBeingUpdated_PackageReferenceUpdatedInBothProjects()
  147. {
  148. CreateAction();
  149. IPackageFromRepository package = AddPackageToAction("A", "1.0");
  150. IPackageManagementProject project1 = AddProjectToSolution();
  151. IPackageManagementProject project2 = AddProjectToSolution();
  152. ProjectHasOlderVersionOfPackage(project1, package);
  153. ProjectHasOlderVersionOfPackage(project2, package);
  154. action.Execute();
  155. project1.AssertWasCalled(p => p.UpdatePackageReference(package, action));
  156. project2.AssertWasCalled(p => p.UpdatePackageReference(package, action));
  157. }
  158. [Test]
  159. public void Execute_TwoProjectsAndOnlyOneHasOlderVersionsOfPackageBeingUpdated_PackageReferenceUpdatedInOnlyOneProject()
  160. {
  161. CreateAction();
  162. IPackageFromRepository package = AddPackageToAction("A", "1.0");
  163. IPackageManagementProject project1 = AddProjectToSolution();
  164. IPackageManagementProject project2 = AddProjectToSolution();
  165. ProjectHasOlderVersionOfPackage(project2, package);
  166. action.Execute();
  167. project1.AssertWasNotCalled(p => p.UpdatePackageReference(package, action));
  168. project2.AssertWasCalled(p => p.UpdatePackageReference(package, action));
  169. }
  170. [Test]
  171. public void Execute_PackageScriptRunnerSet_RunPackageScriptsActionCreatedUsingPackageScriptRunner()
  172. {
  173. CreateAction();
  174. IPackageScriptRunner expectedRunner = CreatePackageScriptRunner();
  175. action.PackageScriptRunner = expectedRunner;
  176. AddPackageToAction("Test", "1.0");
  177. AddProjectToSolution();
  178. action.Execute();
  179. IPackageScriptRunner actualRunner = action.ScriptRunnerPassedToCreateRunPackageScriptsAction;
  180. Assert.AreEqual(expectedRunner, actualRunner);
  181. }
  182. [Test]
  183. public void Execute_PackageScriptRunnerSet_RunPackageScriptsActionCreatedUsingProjects()
  184. {
  185. CreateAction();
  186. AddPackageToAction("Test", "1.0");
  187. IPackageManagementProject project1 = AddProjectToSolution();
  188. IPackageManagementProject project2 = AddProjectToSolution();
  189. var expectedProjects = new IPackageManagementProject[] {
  190. project1,
  191. project2
  192. };
  193. action.PackageScriptRunner = CreatePackageScriptRunner();
  194. action.Execute();
  195. Assert.AreEqual(expectedProjects, action.ProjectsPassedToCreateRunPackageScriptsAction);
  196. }
  197. [Test]
  198. public void Execute_PackageScriptRunnerSet_RunPackageScriptsActionIsDisposed()
  199. {
  200. CreateAction();
  201. AddPackageToAction("Test", "1.0");
  202. AddProjectToSolution();
  203. action.PackageScriptRunner = CreatePackageScriptRunner();
  204. action.Execute();
  205. Assert.IsTrue(action.IsRunPackageScriptsActionDisposed);
  206. }
  207. [Test]
  208. public void Execute_NullPackageScriptRunner_RunPackageScriptsActionIsNotCreated()
  209. {
  210. CreateAction();
  211. AddPackageToAction("Test", "1.0");
  212. AddProjectToSolution();
  213. action.PackageScriptRunner = null;
  214. action.Execute();
  215. Assert.IsFalse(action.IsRunPackageScriptsActionCreated);
  216. }
  217. [Test]
  218. public void Execute_PackageScriptRunnerSet_PackageReferenceUpdatedInProject()
  219. {
  220. CreateAction();
  221. IPackageFromRepository package = AddPackageToAction("Test", "1.0");
  222. IPackageManagementProject project = AddProjectToSolution();
  223. ProjectHasOlderVersionOfPackage(project, package);
  224. action.PackageScriptRunner = CreatePackageScriptRunner();
  225. action.Execute();
  226. project.AssertWasCalled(p => p.UpdatePackageReference(package, action));
  227. }
  228. [Test]
  229. public void Execute_PackageScriptRunnerSet_ProjectsFromSolutionReadOnlyOnce()
  230. {
  231. CreateAction();
  232. IPackageFromRepository package = AddPackageToAction("Test", "1.0");
  233. IPackageManagementProject project = AddProjectToSolution();
  234. ProjectHasOlderVersionOfPackage(project, package);
  235. action.PackageScriptRunner = CreatePackageScriptRunner();
  236. action.Execute();
  237. solution.AssertWasCalled(
  238. s => s.GetProjects(sourceRepository),
  239. setupConstraint => setupConstraint.Repeat.Once());
  240. }
  241. [Test]
  242. public void Execute_NullPackageScriptRunner_ProjectsFromSolutionReadOnlyOnce()
  243. {
  244. CreateAction();
  245. IPackageFromRepository package = AddPackageToAction("Test", "1.0");
  246. IPackageManagementProject project = AddProjectToSolution();
  247. ProjectHasOlderVersionOfPackage(project, package);
  248. action.PackageScriptRunner = null;
  249. action.Execute();
  250. solution.AssertWasCalled(
  251. s => s.GetProjects(sourceRepository),
  252. setupConstraint => setupConstraint.Repeat.Once());
  253. }
  254. [Test]
  255. public void Execute_TwoProjectsBeingUpdated_LoggerSetOnBothProjects()
  256. {
  257. CreateAction();
  258. ILogger logger = MockRepository.GenerateStub<ILogger>();
  259. action.Logger = logger;
  260. IPackageFromRepository package = AddPackageToAction("A", "1.0");
  261. IPackageManagementProject project1 = AddProjectToSolution();
  262. IPackageManagementProject project2 = AddProjectToSolution();
  263. action.Execute();
  264. Assert.AreEqual(logger, project1.Logger);
  265. Assert.AreEqual(logger, project2.Logger);
  266. }
  267. [Test]
  268. public void Execute_OneProjectThatHasOlderVersionOfPackageBeingUpdated_PackagesUpdatedEventIsFired()
  269. {
  270. PackageOperation operation = CreateInstallOperationWithFile(@"tools\readme.txt");
  271. CreateActionWithOperations(operation);
  272. IPackageFromRepository package = AddPackageToAction("Test", "1.0");
  273. IPackageManagementProject project = AddProjectToSolution();
  274. var expectedOperations = new PackageOperation[] { operation };
  275. action.Execute();
  276. packageEvents.AssertWasCalled(events => events.OnParentPackagesUpdated(action.Packages));
  277. }
  278. }
  279. }