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

https://github.com/ajadex/SharpDevelop · C# · 1120 lines · 890 code · 213 blank · 17 comment · 0 complexity · 7e61a29378f6ecbbab3c7cf9c328c5e5 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.Linq;
  20. using System.Collections.Generic;
  21. using ICSharpCode.Core;
  22. using ICSharpCode.PackageManagement;
  23. using ICSharpCode.PackageManagement.Design;
  24. using ICSharpCode.SharpDevelop.Project;
  25. using NuGet;
  26. using NUnit.Framework;
  27. using Rhino.Mocks;
  28. using PackageManagement.Tests.Helpers;
  29. using Rhino.Mocks.Expectations;
  30. namespace PackageManagement.Tests
  31. {
  32. [TestFixture]
  33. public class SharpDevelopPackageManagerTests
  34. {
  35. SharpDevelopPackageManager packageManager;
  36. FakePackageRepository fakeFeedSourceRepository;
  37. FakeSharedPackageRepository fakeSolutionSharedRepository;
  38. IProject testProject;
  39. PackageManagementOptions options;
  40. SolutionPackageRepositoryPath repositoryPaths;
  41. PackageReferenceRepositoryHelper packageRefRepositoryHelper;
  42. TestableProjectManager testableProjectManager;
  43. FakeFileSystem fakeFileSystem;
  44. FakePackageOperationResolverFactory fakePackageOperationResolverFactory;
  45. IPackageOperationResolver fakePackageOperationResolver;
  46. void CreatePackageManager(IProject project, PackageReferenceRepositoryHelper packageRefRepositoryHelper)
  47. {
  48. options = new TestablePackageManagementOptions();
  49. options.PackagesDirectory = "packages";
  50. repositoryPaths = new SolutionPackageRepositoryPath(project, options);
  51. var pathResolver = new DefaultPackagePathResolver(repositoryPaths.PackageRepositoryPath);
  52. fakeFileSystem = new FakeFileSystem();
  53. fakeFeedSourceRepository = new FakePackageRepository();
  54. fakeSolutionSharedRepository = packageRefRepositoryHelper.FakeSharedSourceRepository;
  55. fakePackageOperationResolverFactory = new FakePackageOperationResolverFactory();
  56. var fakeSolutionPackageRepository = new FakeSolutionPackageRepository();
  57. fakeSolutionPackageRepository.FileSystem = fakeFileSystem;
  58. fakeSolutionPackageRepository.PackagePathResolver = pathResolver;
  59. fakeSolutionPackageRepository.FakeSharedRepository = fakeSolutionSharedRepository;
  60. packageManager = new SharpDevelopPackageManager(fakeFeedSourceRepository,
  61. packageRefRepositoryHelper.FakeProjectSystem,
  62. fakeSolutionPackageRepository,
  63. fakePackageOperationResolverFactory);
  64. }
  65. void CreatePackageManager()
  66. {
  67. CreateTestProject();
  68. CreatePackageReferenceRepositoryHelper();
  69. CreatePackageManager(testProject, packageRefRepositoryHelper);
  70. }
  71. void CreatePackageReferenceRepositoryHelper()
  72. {
  73. packageRefRepositoryHelper = new PackageReferenceRepositoryHelper();
  74. }
  75. void CreateTestProject()
  76. {
  77. testProject = ProjectHelper.CreateTestProject();
  78. testProject.ParentSolution.Stub(s => s.Directory).Return(DirectoryName.Create(@"c:\projects\Test\MyProject"));
  79. }
  80. void CreateTestableProjectManager()
  81. {
  82. testableProjectManager = new TestableProjectManager();
  83. packageManager.ProjectManager = testableProjectManager;
  84. }
  85. FakePackage CreateFakePackage(string id = "Test", string version = "1.0.0.0")
  86. {
  87. return new FakePackage(id, version);
  88. }
  89. FakePackage InstallPackage()
  90. {
  91. FakePackage package = CreateFakePackage();
  92. packageManager.InstallPackage(package);
  93. return package;
  94. }
  95. FakePackage InstallPackageWithNoPackageOperations()
  96. {
  97. return InstallPackageWithNoPackageOperations(ignoreDependencies: false);
  98. }
  99. FakePackage InstallPackageWithNoPackageOperationsAndIgnoreDependencies()
  100. {
  101. return InstallPackageWithNoPackageOperations(ignoreDependencies: true);
  102. }
  103. FakePackage InstallPackageWithNoPackageOperationsAndAllowPrereleaseVersions()
  104. {
  105. return InstallPackageWithNoPackageOperations(ignoreDependencies: false, allowPrereleaseVersions: true);
  106. }
  107. FakePackage InstallPackageWithNoPackageOperations(bool ignoreDependencies)
  108. {
  109. return InstallPackageWithNoPackageOperations(ignoreDependencies, allowPrereleaseVersions: false);
  110. }
  111. FakePackage InstallPackageWithNoPackageOperations(bool ignoreDependencies, bool allowPrereleaseVersions)
  112. {
  113. FakePackage package = CreateFakePackage();
  114. var operations = new List<PackageOperation>();
  115. var installAction = new FakeInstallPackageAction();
  116. installAction.IgnoreDependencies = ignoreDependencies;
  117. installAction.AllowPrereleaseVersions = allowPrereleaseVersions;
  118. installAction.Operations = operations;
  119. packageManager.InstallPackage(package, installAction);
  120. return package;
  121. }
  122. FakePackage InstallPackageWithPackageOperations(PackageOperation operation)
  123. {
  124. var operations = new PackageOperation[] {
  125. operation
  126. };
  127. FakePackage package = CreateFakePackage();
  128. var installAction = new FakeInstallPackageAction();
  129. installAction.Operations = operations;
  130. packageManager.InstallPackage(package, installAction);
  131. return package;
  132. }
  133. FakePackage InstallPackageAndIgnoreDependencies()
  134. {
  135. return InstallPackageWithParameters(true, false);
  136. }
  137. FakePackage InstallPackageWithParameters(bool ignoreDependencies, bool allowPrereleaseVersions)
  138. {
  139. FakePackage package = CreateFakePackage();
  140. packageManager.InstallPackage(package, ignoreDependencies, allowPrereleaseVersions);
  141. return package;
  142. }
  143. FakePackage InstallPackageAndAllowPrereleaseVersions()
  144. {
  145. return InstallPackageWithParameters(false, true);
  146. }
  147. FakePackage InstallPackageAndDoNotAllowPrereleaseVersions()
  148. {
  149. return InstallPackageWithParameters(false, false);
  150. }
  151. FakePackage InstallPackageAndDoNotIgnoreDependencies()
  152. {
  153. return InstallPackageWithParameters(false, false);
  154. }
  155. FakePackage UninstallPackage()
  156. {
  157. FakePackage package = CreateFakePackage();
  158. testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
  159. packageManager.UninstallPackage(package);
  160. return package;
  161. }
  162. FakePackage UninstallPackageAndForceRemove()
  163. {
  164. FakePackage package = CreateFakePackage();
  165. testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
  166. bool removeDependencies = false;
  167. bool forceRemove = true;
  168. packageManager.UninstallPackage(package, forceRemove, removeDependencies);
  169. return package;
  170. }
  171. FakePackage UninstallPackageAndRemoveDependencies()
  172. {
  173. FakePackage package = CreateFakePackage();
  174. testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
  175. bool removeDependencies = true;
  176. bool forceRemove = false;
  177. packageManager.UninstallPackage(package, forceRemove, removeDependencies);
  178. return package;
  179. }
  180. PackageOperation CreateOneInstallPackageOperation(string id = "PackageToInstall", string version = "1.0")
  181. {
  182. FakePackage package = CreateFakePackage(id, version);
  183. return new PackageOperation(package, PackageAction.Install);
  184. }
  185. IEnumerable<PackageOperation> GetInstallPackageOperations(FakePackage package)
  186. {
  187. return GetInstallPackageOperations(package, false, false);
  188. }
  189. IEnumerable<PackageOperation> GetInstallPackageOperationsAndIgnoreDependencies(FakePackage package)
  190. {
  191. return GetInstallPackageOperations(package, true, false);
  192. }
  193. IEnumerable<PackageOperation> GetInstallPackageOperationsAndAllowPrereleaseVersions(FakePackage package)
  194. {
  195. return GetInstallPackageOperations(package, false, true);
  196. }
  197. IEnumerable<PackageOperation> GetInstallPackageOperations(
  198. FakePackage package,
  199. bool ignoreDependencies,
  200. bool allowPrereleaseVersions)
  201. {
  202. var fakeInstallAction = new FakeInstallPackageAction();
  203. fakeInstallAction.IgnoreDependencies = ignoreDependencies;
  204. fakeInstallAction.AllowPrereleaseVersions = allowPrereleaseVersions;
  205. return packageManager.GetInstallPackageOperations(package, fakeInstallAction);
  206. }
  207. FakePackage UpdatePackageWithNoPackageOperations()
  208. {
  209. FakePackage package = CreateFakePackage();
  210. var updateAction = new FakeUpdatePackageAction();
  211. updateAction.Operations = new List<PackageOperation>();
  212. updateAction.UpdateDependencies = true;
  213. packageManager.UpdatePackage(package, updateAction);
  214. return package;
  215. }
  216. FakePackage UpdatePackageWithPackageOperations(PackageOperation operation)
  217. {
  218. var operations = new PackageOperation[] {
  219. operation
  220. };
  221. FakePackage package = CreateFakePackage();
  222. var updateAction = new FakeUpdatePackageAction();
  223. updateAction.Operations = operations;
  224. updateAction.UpdateDependencies = true;
  225. packageManager.UpdatePackage(package, updateAction);
  226. return package;
  227. }
  228. FakePackage UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies()
  229. {
  230. return UpdatePackageWithNoPackageOperations(false, false);
  231. }
  232. FakePackage UpdatePackageWithNoPackageOperationsAndAllowPrereleaseVersions()
  233. {
  234. return UpdatePackageWithNoPackageOperations(false, true);
  235. }
  236. FakePackage UpdatePackageWithNoPackageOperations(bool updateDependencies, bool allowPrereleaseVersions)
  237. {
  238. FakePackage package = CreateFakePackage();
  239. var updateAction = new FakeUpdatePackageAction();
  240. updateAction.Operations = new List<PackageOperation>();
  241. updateAction.UpdateDependencies = updateDependencies;
  242. updateAction.AllowPrereleaseVersions = allowPrereleaseVersions;
  243. packageManager.UpdatePackage(package, updateAction);
  244. return package;
  245. }
  246. UpdatePackagesAction CreateUpdatePackagesAction()
  247. {
  248. return new UpdatePackagesAction(new FakePackageManagementProject(), null);
  249. }
  250. UpdatePackagesAction CreateUpdatePackagesActionWithPackages(params IPackageFromRepository[] packages)
  251. {
  252. UpdatePackagesAction action = CreateUpdatePackagesAction();
  253. action.AddPackages(packages);
  254. return action;
  255. }
  256. UpdatePackagesAction CreateUpdatePackagesActionWithOperations(params PackageOperation[] operations)
  257. {
  258. UpdatePackagesAction action = CreateUpdatePackagesAction();
  259. action.AddOperations(operations);
  260. return action;
  261. }
  262. PackageOperation AddInstallOperationForPackage(IPackage package)
  263. {
  264. var operation = new PackageOperation(package, PackageAction.Install);
  265. AddInstallOperationsForPackage(package, operation);
  266. return operation;
  267. }
  268. void AddInstallOperationsForPackage(IPackage package, params PackageOperation[] operations)
  269. {
  270. fakePackageOperationResolver
  271. .Stub(resolver => resolver.ResolveOperations(package))
  272. .Return(operations);
  273. }
  274. void CreateFakePackageResolverForUpdatePackageOperations()
  275. {
  276. fakePackageOperationResolver = MockRepository.GenerateStub<IPackageOperationResolver>();
  277. fakePackageOperationResolverFactory.UpdatePackageOperationsResolver = fakePackageOperationResolver;
  278. }
  279. void RaisePackageRemovedEventWhenPackageReferenceUpdated(
  280. ISharpDevelopProjectManager projectManager,
  281. FakePackage updatedPackage,
  282. params PackageOperationEventArgs[] eventArgs)
  283. {
  284. projectManager
  285. .Stub(manager => manager.UpdatePackageReference(
  286. Arg<string>.Is.Equal(updatedPackage.Id),
  287. Arg<SemanticVersion>.Is.Equal(updatedPackage.Version),
  288. Arg<bool>.Is.Anything,
  289. Arg<bool>.Is.Anything))
  290. .WhenCalled(call => eventArgs.ToList().ForEach(eventArg => projectManager.Raise(manager => manager.PackageReferenceRemoved += null, projectManager, eventArg)));
  291. }
  292. void RaisePackageRemovedEventWhenPackageReferenceAdded(
  293. ISharpDevelopProjectManager projectManager,
  294. FakePackage newPackage,
  295. params PackageOperationEventArgs[] eventArgs)
  296. {
  297. projectManager
  298. .Stub(manager => manager.AddPackageReference(
  299. Arg<string>.Is.Equal(newPackage.Id),
  300. Arg<SemanticVersion>.Is.Equal(newPackage.Version),
  301. Arg<bool>.Is.Anything,
  302. Arg<bool>.Is.Anything))
  303. .WhenCalled(call => eventArgs.ToList().ForEach(eventArg => projectManager.Raise(manager => manager.PackageReferenceRemoved += null, projectManager, eventArg)));
  304. }
  305. [Test]
  306. public void ProjectManager_InstanceCreated_SourceRepositoryIsSharedRepositoryPassedToPackageManager()
  307. {
  308. CreatePackageManager();
  309. Assert.AreEqual(fakeSolutionSharedRepository, packageManager.ProjectManager.SourceRepository);
  310. }
  311. [Test]
  312. public void ProjectManager_InstanceCreated_LocalRepositoryIsPackageReferenceRepository()
  313. {
  314. CreatePackageManager();
  315. PackageReferenceRepository packageRefRepository = packageManager.ProjectManager.LocalRepository as PackageReferenceRepository;
  316. Assert.IsNotNull(packageRefRepository);
  317. }
  318. [Test]
  319. public void ProjectManager_InstanceCreated_LocalRepositoryIsRegisteredWithSharedRepository()
  320. {
  321. CreateTestProject();
  322. CreatePackageReferenceRepositoryHelper();
  323. string expectedPath = @"c:\projects\Test\MyProject";
  324. packageRefRepositoryHelper.FakeProjectSystem.PathToReturnFromGetFullPath = expectedPath;
  325. CreatePackageManager(testProject, packageRefRepositoryHelper);
  326. string actualPath = fakeSolutionSharedRepository.PathPassedToRegisterRepository;
  327. Assert.AreEqual(expectedPath, actualPath);
  328. }
  329. [Test]
  330. public void ProjectManager_InstanceCreated_PathResolverIsPackageManagerPathResolver()
  331. {
  332. CreatePackageManager();
  333. Assert.AreEqual(packageManager.PathResolver, packageManager.ProjectManager.PathResolver);
  334. }
  335. [Test]
  336. public void InstallPackage_PackageInstancePassed_AddsReferenceToProject()
  337. {
  338. CreatePackageManager();
  339. FakePackage package = InstallPackage();
  340. Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
  341. }
  342. [Test]
  343. public void InstallPackage_PackageInstancePassed_DependenciesNotIgnoredWhenAddingReferenceToProject()
  344. {
  345. CreatePackageManager();
  346. CreateTestableProjectManager();
  347. InstallPackage();
  348. Assert.IsFalse(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
  349. }
  350. [Test]
  351. public void InstallPackage_PackageInstancePassed_PrereleaseVersionsNotAllowedWhenAddingReferenceToProject()
  352. {
  353. CreatePackageManager();
  354. CreateTestableProjectManager();
  355. InstallPackage();
  356. Assert.IsFalse(testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
  357. }
  358. [Test]
  359. public void InstallPackage_PackageInstanceAndPackageOperationsPassed_AddsReferenceToProject()
  360. {
  361. CreatePackageManager();
  362. CreateTestableProjectManager();
  363. FakePackage package = InstallPackageWithNoPackageOperations();
  364. Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
  365. }
  366. [Test]
  367. public void InstallPackage_PackageInstanceAndPackageOperationsPassed_DoNotIgnoreDependenciesWhenAddingReferenceToProject()
  368. {
  369. CreatePackageManager();
  370. CreateTestableProjectManager();
  371. InstallPackageWithNoPackageOperations();
  372. Assert.IsFalse(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
  373. }
  374. [Test]
  375. public void InstallPackage_PackageInstanceAndPackageOperationsPassed_DoNotAllowPrereleaseVersionsWhenAddingReferenceToProject()
  376. {
  377. CreatePackageManager();
  378. CreateTestableProjectManager();
  379. InstallPackageWithNoPackageOperations();
  380. Assert.IsFalse(testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
  381. }
  382. [Test]
  383. public void InstallPackage_PackageInstanceAndPackageOperationsPassedAndIgnoreDependenciesIsTrue_IgnoreDependenciesWhenAddingReferenceToProject()
  384. {
  385. CreatePackageManager();
  386. CreateTestableProjectManager();
  387. InstallPackageWithNoPackageOperationsAndIgnoreDependencies();
  388. Assert.IsTrue(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
  389. }
  390. [Test]
  391. public void InstallPackage_PackageInstanceAndPackageOperationsPassedAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsallowedWhenAddingReferenceToProject()
  392. {
  393. CreatePackageManager();
  394. CreateTestableProjectManager();
  395. InstallPackageWithNoPackageOperationsAndAllowPrereleaseVersions();
  396. Assert.IsTrue(testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
  397. }
  398. [Test]
  399. public void InstallPackage_PackageInstanceAndOneInstallPackageOperationPassed_PackageDefinedInOperationIsInstalledInLocalRepository()
  400. {
  401. CreatePackageManager();
  402. CreateTestableProjectManager();
  403. PackageOperation operation = CreateOneInstallPackageOperation();
  404. InstallPackageWithPackageOperations(operation);
  405. Assert.AreEqual(operation.Package, fakeSolutionSharedRepository.FirstPackageAdded);
  406. }
  407. [Test]
  408. public void InstallPackage_PackageDependenciesIgnored_IgnoreDependenciesPassedToProjectManager()
  409. {
  410. CreatePackageManager();
  411. CreateTestableProjectManager();
  412. InstallPackageAndIgnoreDependencies();
  413. Assert.IsTrue(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
  414. }
  415. [Test]
  416. public void InstallPackage_AllowPrereleaseVersions_AllowPrereleaseVersionsPassedToProjectManager()
  417. {
  418. CreatePackageManager();
  419. CreateTestableProjectManager();
  420. InstallPackageAndAllowPrereleaseVersions();
  421. Assert.IsTrue(testableProjectManager.AllowPrereleaseVersionsPassedToAddPackageReference);
  422. }
  423. [Test]
  424. public void InstallPackage_PackageDependenciesIgnored_AddsReferenceToPackage()
  425. {
  426. CreatePackageManager();
  427. CreateTestableProjectManager();
  428. FakePackage package = InstallPackageAndIgnoreDependencies();
  429. Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
  430. }
  431. [Test]
  432. public void InstallPackage_PackageDependenciesNotIgnored_IgnoreDependenciesPassedToProjectManager()
  433. {
  434. CreatePackageManager();
  435. CreateTestableProjectManager();
  436. InstallPackageAndDoNotIgnoreDependencies();
  437. Assert.IsFalse(testableProjectManager.IgnoreDependenciesPassedToAddPackageReference);
  438. }
  439. [Test]
  440. public void InstallPackage_PackageDependenciesNotIgnored_AddsReferenceToPackage()
  441. {
  442. CreatePackageManager();
  443. CreateTestableProjectManager();
  444. FakePackage package = InstallPackageAndDoNotIgnoreDependencies();
  445. Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
  446. }
  447. [Test]
  448. public void UninstallPackage_PackageInProjectLocalRepository_RemovesReferenceFromProject()
  449. {
  450. CreatePackageManager();
  451. CreateTestableProjectManager();
  452. FakePackage package = UninstallPackage();
  453. Assert.AreEqual(package.Id, testableProjectManager.PackagePassedToRemovePackageReference.Id);
  454. }
  455. [Test]
  456. public void UninstallPackage_PackageInProjectLocalRepository_DoesNotRemoveReferenceForcefullyFromProject()
  457. {
  458. CreatePackageManager();
  459. CreateTestableProjectManager();
  460. UninstallPackage();
  461. Assert.IsFalse(testableProjectManager.ForcePassedToRemovePackageReference);
  462. }
  463. [Test]
  464. public void UninstallPackage_PackageInProjectLocalRepository_DependenciesNotRemovedWhenPackageReferenceRemovedFromProject()
  465. {
  466. CreatePackageManager();
  467. CreateTestableProjectManager();
  468. UninstallPackage();
  469. Assert.IsFalse(testableProjectManager.RemoveDependenciesPassedToRemovePackageReference);
  470. }
  471. [Test]
  472. public void UninstallPackage_PassingForceRemove_ReferenceForcefullyRemovedFromProject()
  473. {
  474. CreatePackageManager();
  475. CreateTestableProjectManager();
  476. UninstallPackageAndForceRemove();
  477. Assert.IsTrue(testableProjectManager.ForcePassedToRemovePackageReference);
  478. }
  479. [Test]
  480. public void UninstallPackage_PassingRemoveDependencies_DependenciesRemovedWhenPackageReferenceRemovedFromProject()
  481. {
  482. CreatePackageManager();
  483. CreateTestableProjectManager();
  484. UninstallPackageAndRemoveDependencies();
  485. Assert.IsTrue(testableProjectManager.RemoveDependenciesPassedToRemovePackageReference);
  486. }
  487. [Test]
  488. public void UninstallPackage_ProjectLocalRepositoryHasPackage_PackageRemovedFromProjectRepositoryBeforeSolutionRepository()
  489. {
  490. CreatePackageManager();
  491. CreateTestableProjectManager();
  492. FakePackage package = CreateFakePackage();
  493. package.Id = "Test";
  494. testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
  495. IPackage packageRemovedFromProject = null;
  496. packageManager.PackageUninstalled += (sender, e) => {
  497. packageRemovedFromProject = testableProjectManager.PackagePassedToRemovePackageReference;
  498. };
  499. packageManager.UninstallPackage(package);
  500. Assert.AreEqual("Test", packageRemovedFromProject.Id);
  501. }
  502. [Test]
  503. public void UninstallPackage_PackageReferencedByNoProjects_PackageIsRemovedFromSharedSolutionRepository()
  504. {
  505. CreatePackageManager();
  506. CreateTestableProjectManager();
  507. FakePackage package = CreateFakePackage();
  508. package.Id = "MyPackageId";
  509. testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
  510. fakeSolutionSharedRepository.FakePackages.Add(package);
  511. packageManager.UninstallPackage(package);
  512. bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains(package);
  513. Assert.IsFalse(containsPackage);
  514. }
  515. [Test]
  516. public void UninstallPackage_PackageReferencedByTwoProjects_PackageIsNotRemovedFromSharedSolutionRepository()
  517. {
  518. CreatePackageManager();
  519. CreateTestableProjectManager();
  520. var package = new FakePackage("MyPackageId", "1.4.5.2");
  521. testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
  522. fakeSolutionSharedRepository.FakePackages.Add(package);
  523. fakeSolutionSharedRepository.PackageIdsReferences.Add("MyPackageId");
  524. packageManager.UninstallPackage(package);
  525. bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains(package);
  526. Assert.IsTrue(containsPackage);
  527. Assert.AreEqual("MyPackageId", fakeSolutionSharedRepository.PackageIdPassedToIsReferenced);
  528. Assert.AreEqual(package.Version, fakeSolutionSharedRepository.VersionPassedToIsReferenced);
  529. }
  530. [Test]
  531. public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageOperationsReturnedFromPackageOperationsResolverCreated()
  532. {
  533. CreatePackageManager();
  534. var package = new FakePackage();
  535. IEnumerable<PackageOperation> operations = GetInstallPackageOperations(package);
  536. IEnumerable<PackageOperation> expectedOperations = fakePackageOperationResolverFactory.FakeInstallPackageOperationResolver.PackageOperations;
  537. Assert.AreEqual(expectedOperations, operations);
  538. }
  539. [Test]
  540. public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations()
  541. {
  542. CreatePackageManager();
  543. var package = new FakePackage();
  544. GetInstallPackageOperations(package);
  545. IPackageRepository expectedRepository = packageManager.LocalRepository;
  546. IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
  547. Assert.AreEqual(expectedRepository, actualRepository);
  548. }
  549. [Test]
  550. public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations()
  551. {
  552. CreatePackageManager();
  553. var package = new FakePackage();
  554. GetInstallPackageOperations(package);
  555. IPackageRepository expectedRepository = packageManager.SourceRepository;
  556. IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
  557. Assert.AreEqual(expectedRepository, actualRepository);
  558. }
  559. [Test]
  560. public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_DependenciesNotIgnored()
  561. {
  562. CreatePackageManager();
  563. var package = new FakePackage();
  564. GetInstallPackageOperations(package);
  565. bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
  566. Assert.IsFalse(result);
  567. }
  568. [Test]
  569. public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations()
  570. {
  571. CreatePackageManager();
  572. var package = new FakePackage();
  573. GetInstallPackageOperations(package);
  574. ILogger expectedLogger = packageManager.Logger;
  575. ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateInstallPackageOperationResolver;
  576. Assert.AreEqual(expectedLogger, actualLogger);
  577. }
  578. [Test]
  579. public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageUsedWhenGettingPackageOperations()
  580. {
  581. CreatePackageManager();
  582. var package = new FakePackage();
  583. GetInstallPackageOperations(package);
  584. IPackage actualPackage = fakePackageOperationResolverFactory
  585. .FakeInstallPackageOperationResolver
  586. .PackagePassedToResolveOperations;
  587. Assert.AreEqual(package, actualPackage);
  588. }
  589. [Test]
  590. public void GetInstallPackageOperations_IgnoreDependenciesIsTrue_PackageOperationResolverIgnoresDependencies()
  591. {
  592. CreatePackageManager();
  593. var package = new FakePackage();
  594. GetInstallPackageOperationsAndIgnoreDependencies(package);
  595. bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
  596. Assert.IsTrue(result);
  597. }
  598. [Test]
  599. public void GetInstallPackageOperations_AllowPrereleaseVersionsIsTrue_PackageOperationResolverAllowsPrereleaseVersions()
  600. {
  601. CreatePackageManager();
  602. var package = new FakePackage();
  603. GetInstallPackageOperationsAndAllowPrereleaseVersions(package);
  604. bool result = fakePackageOperationResolverFactory.AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
  605. Assert.IsTrue(result);
  606. }
  607. [Test]
  608. public void GetInstallPackageOperations_AllowPrereleaseVersionsIsFalse_PackageOperationResolverDoesNotAllowPrereleaseVersions()
  609. {
  610. CreatePackageManager();
  611. var package = new FakePackage();
  612. GetInstallPackageOperations(package);
  613. bool result = fakePackageOperationResolverFactory.AllowPrereleaseVersionsPassedToCreateInstallPackageOperationResolver;
  614. Assert.IsFalse(result);
  615. }
  616. public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesReferenceInProject()
  617. {
  618. CreatePackageManager();
  619. CreateTestableProjectManager();
  620. FakePackage package = UpdatePackageWithNoPackageOperations();
  621. Assert.AreEqual(package, testableProjectManager.PackagePassedToUpdatePackageReference);
  622. }
  623. [Test]
  624. public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesDependenciesInProject()
  625. {
  626. CreatePackageManager();
  627. CreateTestableProjectManager();
  628. FakePackage package = UpdatePackageWithNoPackageOperations();
  629. Assert.IsTrue(testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
  630. }
  631. [Test]
  632. public void UpdatePackage_PackageInstanceAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedToUpdateProject()
  633. {
  634. CreatePackageManager();
  635. CreateTestableProjectManager();
  636. FakePackage package = UpdatePackageWithNoPackageOperationsAndAllowPrereleaseVersions();
  637. Assert.IsTrue(testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
  638. }
  639. [Test]
  640. public void UpdatePackage_PackageInstanceAndAllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedToUpdateProject()
  641. {
  642. CreatePackageManager();
  643. CreateTestableProjectManager();
  644. FakePackage package = UpdatePackageWithNoPackageOperations();
  645. Assert.IsFalse(testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
  646. }
  647. [Test]
  648. public void UpdatePackage_PackageInstanceAndOneInstallPackageOperationPassed_PackageDefinedInOperationIsInstalledInLocalRepository()
  649. {
  650. CreatePackageManager();
  651. CreateTestableProjectManager();
  652. PackageOperation operation = CreateOneInstallPackageOperation();
  653. UpdatePackageWithPackageOperations(operation);
  654. Assert.AreEqual(operation.Package, fakeSolutionSharedRepository.FirstPackageAdded);
  655. }
  656. [Test]
  657. public void UpdatePackage_UpdateDependenciesSetToFalse_DependenciesInProjectNotUpdated()
  658. {
  659. CreatePackageManager();
  660. CreateTestableProjectManager();
  661. UpdatePackageWithNoPackageOperationsAndDoNotUpdateDependencies();
  662. Assert.IsFalse(testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
  663. }
  664. [Test]
  665. public void UpdatePackages_OnePackage_PackageReferencedIsAddedToProject()
  666. {
  667. CreatePackageManager();
  668. CreateTestableProjectManager();
  669. FakePackage package = CreateFakePackage("Test", "1.1");
  670. UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages(package);
  671. packageManager.UpdatePackages(action);
  672. Assert.AreEqual(package, testableProjectManager.PackagePassedToUpdatePackageReference);
  673. }
  674. [Test]
  675. public void UpdatePackages_TwoPackages_PackageReferencedIsAddedToProjectForBothPackages()
  676. {
  677. CreatePackageManager();
  678. CreateTestableProjectManager();
  679. FakePackage package1 = CreateFakePackage("First", "1.1");
  680. FakePackage package2 = CreateFakePackage("Second", "2.0");
  681. var expectedPackages = new FakePackage[] { package1, package2 };
  682. UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages(expectedPackages);
  683. packageManager.UpdatePackages(action);
  684. PackageCollectionAssert.AreEqual(expectedPackages, testableProjectManager.PackagesPassedToUpdatePackageReference);
  685. }
  686. [Test]
  687. public void UpdatePackages_UpdateDependenciesIsTrue_UpdateDependenciesPassedToProjectManager()
  688. {
  689. CreatePackageManager();
  690. CreateTestableProjectManager();
  691. FakePackage package = CreateFakePackage("Test", "1.1");
  692. UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages(package);
  693. action.UpdateDependencies = true;
  694. packageManager.UpdatePackages(action);
  695. Assert.IsTrue(testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
  696. }
  697. [Test]
  698. public void UpdatePackages_UpdateDependenciesIsFalse_UpdateDependenciesPassedToProjectManager()
  699. {
  700. CreatePackageManager();
  701. CreateTestableProjectManager();
  702. FakePackage package = CreateFakePackage("Test", "1.1");
  703. UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages(package);
  704. action.UpdateDependencies = false;
  705. packageManager.UpdatePackages(action);
  706. Assert.IsFalse(testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
  707. }
  708. [Test]
  709. public void UpdatePackages_AllowPrereleaseVersionsIsTrue_AllowPrereleaseVersionsPassedToProjectManager()
  710. {
  711. CreatePackageManager();
  712. CreateTestableProjectManager();
  713. FakePackage package = CreateFakePackage("Test", "1.1");
  714. UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages(package);
  715. action.AllowPrereleaseVersions = true;
  716. packageManager.UpdatePackages(action);
  717. Assert.IsTrue(testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
  718. }
  719. [Test]
  720. public void UpdatePackages_AllowPrereleaseVersionsIsFalse_AllowPrereleaseVersionsPassedToProjectManager()
  721. {
  722. CreatePackageManager();
  723. CreateTestableProjectManager();
  724. FakePackage package = CreateFakePackage("Test", "1.1");
  725. UpdatePackagesAction action = CreateUpdatePackagesActionWithPackages(package);
  726. action.AllowPrereleaseVersions = false;
  727. packageManager.UpdatePackages(action);
  728. Assert.IsFalse(testableProjectManager.AllowPrereleaseVersionsPassedToUpdatePackageReference);
  729. }
  730. [Test]
  731. public void UpdatePackages_TwoPackageOperations_BothPackagesInOperationsAddedToSharedRepository()
  732. {
  733. CreatePackageManager();
  734. CreateTestableProjectManager();
  735. PackageOperation operation1 = CreateOneInstallPackageOperation("First", "1.0");
  736. PackageOperation operation2 = CreateOneInstallPackageOperation("Second", "1.0");
  737. UpdatePackagesAction action = CreateUpdatePackagesActionWithOperations(operation1, operation2);
  738. var expectedPackages = new FakePackage[] {
  739. operation1.Package as FakePackage,
  740. operation2.Package as FakePackage
  741. };
  742. packageManager.UpdatePackages(action);
  743. PackageCollectionAssert.AreEqual(expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
  744. }
  745. [Test]
  746. public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLoggerWhenGettingPackageOperations()
  747. {
  748. CreatePackageManager();
  749. FakePackage package = CreateFakePackage("Test", "1.1");
  750. UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages(package);
  751. packageManager.GetUpdatePackageOperations(updateAction.Packages, updateAction);
  752. ILogger expectedLogger = packageManager.Logger;
  753. ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateUpdatePackageOperationResolver;
  754. Assert.AreEqual(expectedLogger, actualLogger);
  755. }
  756. [Test]
  757. public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesLocalRepositoryWhenGettingPackageOperations()
  758. {
  759. CreatePackageManager();
  760. FakePackage package = CreateFakePackage("Test", "1.1");
  761. UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages(package);
  762. packageManager.GetUpdatePackageOperations(updateAction.Packages, updateAction);
  763. IPackageRepository expectedRepository = packageManager.LocalRepository;
  764. IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateUpdatePackageOperationsResolver;
  765. Assert.AreEqual(expectedRepository, actualRepository);
  766. }
  767. [Test]
  768. public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesSourceRepositoryWhenGettingPackageOperations()
  769. {
  770. CreatePackageManager();
  771. FakePackage package = CreateFakePackage("Test", "1.1");
  772. UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages(package);
  773. packageManager.GetUpdatePackageOperations(updateAction.Packages, updateAction);
  774. IPackageRepository expectedRepository = packageManager.SourceRepository;
  775. IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateUpdatePackageOperationsResolver;
  776. Assert.AreEqual(expectedRepository, actualRepository);
  777. }
  778. [Test]
  779. public void GetUpdatePackageOperations_PackageOperationResolverFactoryUsed_PackageManagerUsesUpdatePackageSettingsWhenGettingPackageOperations()
  780. {
  781. CreatePackageManager();
  782. FakePackage package = CreateFakePackage("Test", "1.1");
  783. UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages(package);
  784. packageManager.GetUpdatePackageOperations(updateAction.Packages, updateAction);
  785. IUpdatePackageSettings settings = fakePackageOperationResolverFactory.SettingsPassedToCreatePackageOperationResolver;
  786. Assert.AreEqual(updateAction, settings);
  787. }
  788. [Test]
  789. public void GetUpdatePackageOperations_TwoPackages_ReturnsPackageOperationsForBothPackages()
  790. {
  791. CreatePackageManager();
  792. CreateFakePackageResolverForUpdatePackageOperations();
  793. IPackageFromRepository package1 = CreateFakePackage("Test", "1.0");
  794. IPackageFromRepository package2 = CreateFakePackage("Test2", "1.0");
  795. PackageOperation operation1 = AddInstallOperationForPackage(package1);
  796. PackageOperation operation2 = AddInstallOperationForPackage(package2);
  797. UpdatePackagesAction updateAction = CreateUpdatePackagesActionWithPackages(package1, package2);
  798. List<PackageOperation> operations = packageManager.GetUpdatePackageOperations(updateAction.Packages, updateAction).ToList();
  799. Assert.AreEqual(2, operations.Count());
  800. Assert.Contains(operation1, operations);
  801. Assert.Contains(operation2, operations);
  802. }
  803. [Test]
  804. public void RunPackageOperations_TwoPackageOperations_BothPackagesInOperationsAddedToSharedRepository()
  805. {
  806. CreatePackageManager();
  807. CreateTestableProjectManager();
  808. PackageOperation operation1 = CreateOneInstallPackageOperation("First", "1.0");
  809. PackageOperation operation2 = CreateOneInstallPackageOperation("Second", "1.0");
  810. var operations = new PackageOperation[] { operation1, operation2 };
  811. var expectedPackages = new FakePackage[] {
  812. operation1.Package as FakePackage,
  813. operation2.Package as FakePackage
  814. };
  815. packageManager.RunPackageOperations(operations);
  816. PackageCollectionAssert.AreEqual(expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
  817. }
  818. [Test]
  819. public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdating_OldPackageIsUninstalled()
  820. {
  821. CreatePackageManager();
  822. var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
  823. packageManager.ProjectManager = fakeProjectManager;
  824. FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage", "1.0");
  825. FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
  826. var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
  827. RaisePackageRemovedEventWhenPackageReferenceUpdated(fakeProjectManager, updatedPackage, eventArgs);
  828. var updateAction = new FakeUpdatePackageAction {
  829. Operations = new List<PackageOperation>(),
  830. UpdateDependencies = false
  831. };
  832. packageManager.UpdatePackage(updatedPackage, updateAction);
  833. Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
  834. }
  835. [Test]
  836. public void UpdatePackage_TwoOldPackageReferencesAreRemovedOnUpdating_BothOldPackagesAreUninstalled()
  837. {
  838. CreatePackageManager();
  839. var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
  840. packageManager.ProjectManager = fakeProjectManager;
  841. FakePackage installedPackage1 = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage-Core", "1.0");
  842. FakePackage installedPackage2 = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage", "1.0");
  843. FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
  844. var eventArgs1 = new PackageOperationEventArgs(installedPackage1, null, null);
  845. var eventArgs2 = new PackageOperationEventArgs(installedPackage2, null, null);
  846. RaisePackageRemovedEventWhenPackageReferenceUpdated(fakeProjectManager, updatedPackage, eventArgs1, eventArgs2);
  847. var updateAction = new FakeUpdatePackageAction {
  848. Operations = new List<PackageOperation>(),
  849. UpdateDependencies = false
  850. };
  851. packageManager.UpdatePackage(updatedPackage, updateAction);
  852. Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage2));
  853. Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage1));
  854. }
  855. [Test]
  856. public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdatingButAnotherProjectStillReferencesThePackage_OldPackageIsNotUninstalled()
  857. {
  858. CreatePackageManager();
  859. var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
  860. packageManager.ProjectManager = fakeProjectManager;
  861. FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage-Core", "1.0");
  862. FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
  863. var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
  864. RaisePackageRemovedEventWhenPackageReferenceUpdated(fakeProjectManager, updatedPackage, eventArgs);
  865. var updateAction = new FakeUpdatePackageAction {
  866. Operations = new List<PackageOperation>(),
  867. UpdateDependencies = false
  868. };
  869. fakeSolutionSharedRepository.PackageIdsReferences.Add("MyPackage-Core");
  870. packageManager.UpdatePackage(updatedPackage, updateAction);
  871. Assert.IsTrue(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
  872. }
  873. [Test]
  874. public void InstallPackage_OldPackageReferenceIsRemovedOnInstalling_OldPackageIsUninstalled()
  875. {
  876. CreatePackageManager();
  877. var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
  878. packageManager.ProjectManager = fakeProjectManager;
  879. FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage", "1.0");
  880. FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
  881. var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
  882. RaisePackageRemovedEventWhenPackageReferenceAdded(fakeProjectManager, newPackage, eventArgs);
  883. var installAction = new FakeInstallPackageAction {
  884. Operations = new List<PackageOperation>()
  885. };
  886. packageManager.InstallPackage(newPackage, installAction);
  887. Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
  888. }
  889. [Test]
  890. public void InstallPackage_OldPackageReferenceIsRemovedOnInstallingButOtherProjectsReferencesOldPackage_OldPackageIsNotUninstalled()
  891. {
  892. CreatePackageManager();
  893. var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
  894. packageManager.ProjectManager = fakeProjectManager;
  895. FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage.Core", "1.0");
  896. FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
  897. fakeSolutionSharedRepository.PackageIdsReferences.Add("MyPackage.Core");
  898. var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
  899. RaisePackageRemovedEventWhenPackageReferenceAdded(fakeProjectManager, newPackage, eventArgs);
  900. var installAction = new FakeInstallPackageAction {
  901. Operations = new List<PackageOperation>()
  902. };
  903. packageManager.InstallPackage(newPackage, installAction);
  904. Assert.IsTrue(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
  905. }
  906. }
  907. }