PageRenderTime 69ms CodeModel.GetById 32ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://github.com/ajadex/SharpDevelop
C# | 1535 lines | 1185 code | 332 blank | 18 comment | 0 complexity | 591648aaf45aad6bfca6331c423b23ad 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 System.Linq;
  21. using ICSharpCode.PackageManagement;
  22. using ICSharpCode.PackageManagement.Design;
  23. using ICSharpCode.PackageManagement.Scripting;
  24. using NuGet;
  25. using NUnit.Framework;
  26. using PackageManagement.Tests.Helpers;
  27. using Rhino.Mocks;
  28. namespace PackageManagement.Tests
  29. {
  30. [TestFixture]
  31. public class PackageViewModelTests
  32. {
  33. TestablePackageViewModel viewModel;
  34. FakePackage fakePackage;
  35. FakePackageManagementSolution fakeSolution;
  36. FakePackageManagementEvents fakePackageManagementEvents;
  37. ExceptionThrowingPackageManagementSolution exceptionThrowingSolution;
  38. ExceptionThrowingPackageManagementProject exceptionThrowingProject;
  39. FakeUninstallPackageAction fakeUninstallPackageAction;
  40. FakeLogger fakeLogger;
  41. FakePackageActionRunner fakeActionRunner;
  42. List<FakeSelectedProject> fakeSelectedProjects;
  43. IPackageViewModelParent viewModelParent;
  44. void CreateFakeSolution()
  45. {
  46. fakeSolution = new FakePackageManagementSolution();
  47. fakeSolution.FakeActiveMSBuildProject = ProjectHelper.CreateTestProject();
  48. }
  49. void CreateViewModel()
  50. {
  51. CreateFakeSolution();
  52. CreateViewModel(fakeSolution);
  53. }
  54. void CreateViewModelWithExceptionThrowingSolution()
  55. {
  56. exceptionThrowingSolution = new ExceptionThrowingPackageManagementSolution();
  57. exceptionThrowingSolution.FakeActiveMSBuildProject = ProjectHelper.CreateTestProject();
  58. CreateViewModel(exceptionThrowingSolution);
  59. }
  60. void CreateViewModelWithExceptionThrowingProject()
  61. {
  62. CreateViewModel();
  63. exceptionThrowingProject = new ExceptionThrowingPackageManagementProject();
  64. viewModel.FakeSolution.FakeProjectToReturnFromGetProject = exceptionThrowingProject;
  65. }
  66. void CreateViewModel(FakePackageManagementSolution solution)
  67. {
  68. viewModelParent = MockRepository.GenerateStub<IPackageViewModelParent>();
  69. viewModel = new TestablePackageViewModel(viewModelParent, solution);
  70. fakePackage = viewModel.FakePackage;
  71. this.fakeSolution = solution;
  72. fakePackageManagementEvents = viewModel.FakePackageManagementEvents;
  73. fakeLogger = viewModel.FakeLogger;
  74. fakeUninstallPackageAction = solution.FakeProjectToReturnFromGetProject.FakeUninstallPackageAction;
  75. fakeActionRunner = viewModel.FakeActionRunner;
  76. }
  77. void AddProjectToSolution()
  78. {
  79. TestableProject project = ProjectHelper.CreateTestProject();
  80. fakeSolution.FakeMSBuildProjects.Add(project);
  81. }
  82. void CreateViewModelWithTwoProjectsSelected(string projectName1, string projectName2)
  83. {
  84. CreateFakeSolution();
  85. AddTwoProjectsSelected(projectName1, projectName2);
  86. CreateViewModel(fakeSolution);
  87. }
  88. void AddTwoProjectsSelected(string projectName1, string projectName2)
  89. {
  90. AddProjectToSolution();
  91. AddProjectToSolution();
  92. fakeSolution.FakeMSBuildProjects[0].Name = projectName1;
  93. fakeSolution.FakeMSBuildProjects[1].Name = projectName2;
  94. fakeSolution.NoProjectsSelected();
  95. fakeSolution.AddFakeProjectToReturnFromGetProject(projectName1);
  96. fakeSolution.AddFakeProjectToReturnFromGetProject(projectName2);
  97. }
  98. void SetPackageIdAndVersion(string id, string version)
  99. {
  100. fakePackage.Id = id;
  101. fakePackage.Version = new SemanticVersion(version);
  102. }
  103. void UserCancelsProjectSelection()
  104. {
  105. fakePackageManagementEvents.OnSelectProjectsReturnValue = false;
  106. }
  107. void UserAcceptsProjectSelection()
  108. {
  109. fakePackageManagementEvents.OnSelectProjectsReturnValue = true;
  110. }
  111. List<FakeSelectedProject> CreateTwoFakeSelectedProjects()
  112. {
  113. fakeSelectedProjects = new List<FakeSelectedProject>();
  114. fakeSelectedProjects.Add(new FakeSelectedProject("Project A"));
  115. fakeSelectedProjects.Add(new FakeSelectedProject("Project B"));
  116. return fakeSelectedProjects;
  117. }
  118. FakePackageOperation AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FakeSelectedProject selectedProject)
  119. {
  120. return AddFakeInstallPackageOperationWithPackage(selectedProject, requireLicenseAcceptance: true);
  121. }
  122. FakePackageOperation AddFakeInstallPackageOperationWithPackageThatDoesNotRequireLicenseAcceptance(FakeSelectedProject selectedProject)
  123. {
  124. return AddFakeInstallPackageOperationWithPackage(selectedProject, requireLicenseAcceptance: false);
  125. }
  126. FakePackageOperation AddFakeInstallPackageOperationWithPackage(FakeSelectedProject selectedProject, bool requireLicenseAcceptance)
  127. {
  128. FakePackageOperation operation = selectedProject.AddFakeInstallPackageOperation();
  129. operation.FakePackage.RequireLicenseAcceptance = requireLicenseAcceptance;
  130. return operation;
  131. }
  132. FakePackageOperation AddFakeUninstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FakeSelectedProject selectedProject)
  133. {
  134. FakePackageOperation uninstallOperation = selectedProject.AddFakeUninstallPackageOperation();
  135. uninstallOperation.FakePackage.RequireLicenseAcceptance = true;
  136. return uninstallOperation;
  137. }
  138. FakeSelectedProject FirstFakeSelectedProject {
  139. get { return fakeSelectedProjects[0]; }
  140. }
  141. FakeSelectedProject SecondFakeSelectedProject {
  142. get { return fakeSelectedProjects[1]; }
  143. }
  144. void ParentAllowsPrereleasePackages()
  145. {
  146. viewModelParent.Stub(parent => parent.IncludePrerelease).Return(true);
  147. }
  148. [Test]
  149. public void AddPackageCommand_CommandExecuted_InstallsPackage()
  150. {
  151. CreateViewModel();
  152. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  153. viewModel.AddPackageCommand.Execute(null);
  154. IPackage package = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated.Package;
  155. Assert.AreEqual(fakePackage, package);
  156. }
  157. [Test]
  158. public void AddPackage_PackageAddedSuccessfully_SourcePackageRepositoryUsedToCreateProject()
  159. {
  160. CreateViewModel();
  161. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  162. viewModel.AddPackage();
  163. Assert.AreEqual(fakePackage.Repository, fakeSolution.RepositoryPassedToGetProject);
  164. }
  165. [Test]
  166. public void AddPackage_PackageAddedSuccessfully_PackageIsInstalled()
  167. {
  168. CreateViewModel();
  169. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  170. viewModel.AddPackage();
  171. IPackageAction actionExecuted = fakeActionRunner.ActionPassedToRun;
  172. IPackageAction action = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated;
  173. Assert.AreEqual(action, actionExecuted);
  174. }
  175. [Test]
  176. public void AddPackage_PackageAddedSuccessfully_PackageOperationsUsedWhenInstallingPackage()
  177. {
  178. CreateViewModel();
  179. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  180. viewModel.AddPackage();
  181. PackageOperation[] expectedOperations = new PackageOperation[] {
  182. new PackageOperation(fakePackage, PackageAction.Install)
  183. };
  184. FakeInstallPackageAction action = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated;
  185. CollectionAssert.AreEqual(expectedOperations, action.Operations);
  186. }
  187. [Test]
  188. public void PackageChanged_PackageAddedSuccessfully_PropertyNotifyChangedFiredForIsAddedProperty()
  189. {
  190. CreateViewModel();
  191. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  192. string propertyChangedName = null;
  193. viewModel.PropertyChanged += (sender, e) => propertyChangedName = e.PropertyName;
  194. viewModel.AddPackage();
  195. viewModel.PackageChanged();
  196. Assert.AreEqual("IsAdded", propertyChangedName);
  197. }
  198. [Test]
  199. public void PackageChanged_PackageAddedSuccessfully_PropertyNotifyChangedFiredAfterPackageInstalled()
  200. {
  201. CreateViewModel();
  202. IPackage packagePassedToInstallPackageWhenPropertyNameChanged = null;
  203. viewModel.PropertyChanged += (sender, e) => {
  204. packagePassedToInstallPackageWhenPropertyNameChanged =
  205. fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated.Package;
  206. };
  207. viewModel.AddPackage();
  208. viewModel.PackageChanged();
  209. Assert.AreEqual(fakePackage, packagePassedToInstallPackageWhenPropertyNameChanged);
  210. }
  211. [Test]
  212. public void HasLicenseUrl_PackageHasLicenseUrl_ReturnsTrue()
  213. {
  214. CreateViewModel();
  215. fakePackage.LicenseUrl = new Uri("http://sharpdevelop.com");
  216. Assert.IsTrue(viewModel.HasLicenseUrl);
  217. }
  218. [Test]
  219. public void HasLicenseUrl_PackageHasNoLicenseUrl_ReturnsFalse()
  220. {
  221. CreateViewModel();
  222. fakePackage.LicenseUrl = null;
  223. Assert.IsFalse(viewModel.HasLicenseUrl);
  224. }
  225. [Test]
  226. public void HasProjectUrl_PackageHasProjectUrl_ReturnsTrue()
  227. {
  228. CreateViewModel();
  229. fakePackage.ProjectUrl = new Uri("http://sharpdevelop.com");
  230. Assert.IsTrue(viewModel.HasProjectUrl);
  231. }
  232. [Test]
  233. public void HasProjectUrl_PackageHasNoProjectUrl_ReturnsFalse()
  234. {
  235. CreateViewModel();
  236. fakePackage.ProjectUrl = null;
  237. Assert.IsFalse(viewModel.HasProjectUrl);
  238. }
  239. [Test]
  240. public void HasReportAbuseUrl_PackageHasReportAbuseUrl_ReturnsTrue()
  241. {
  242. CreateViewModel();
  243. fakePackage.ReportAbuseUrl = new Uri("http://sharpdevelop.com");
  244. Assert.IsTrue(viewModel.HasReportAbuseUrl);
  245. }
  246. [Test]
  247. public void HasReportAbuseUrl_PackageHasNoReportAbuseUrl_ReturnsFalse()
  248. {
  249. CreateViewModel();
  250. fakePackage.ReportAbuseUrl = null;
  251. Assert.IsFalse(viewModel.HasReportAbuseUrl);
  252. }
  253. [Test]
  254. public void IsAdded_ProjectHasPackageAdded_ReturnsTrue()
  255. {
  256. CreateViewModel();
  257. fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Add(fakePackage);
  258. Assert.IsTrue(viewModel.IsAdded);
  259. }
  260. [Test]
  261. public void IsAdded_ProjectDoesNotHavePackageInstalled_ReturnsFalse()
  262. {
  263. CreateViewModel();
  264. fakeSolution.FakeProjectToReturnFromGetProject.FakePackages.Clear();
  265. Assert.IsFalse(viewModel.IsAdded);
  266. }
  267. [Test]
  268. public void RemovePackageCommand_CommandExecuted_UninstallsPackage()
  269. {
  270. CreateViewModel();
  271. viewModel.RemovePackageCommand.Execute(null);
  272. Assert.AreEqual(fakePackage, fakeUninstallPackageAction.Package);
  273. }
  274. [Test]
  275. public void RemovePackage_PackageRemovedSuccessfully_RepositoryUsedToCreateProject()
  276. {
  277. CreateViewModel();
  278. viewModel.RemovePackage();
  279. Assert.AreEqual(fakePackage.Repository, fakeSolution.RepositoryPassedToGetProject);
  280. }
  281. [Test]
  282. public void PackageChanged_PackageRemovedSuccessfully_PropertyNotifyChangedFiredForIsAddedProperty()
  283. {
  284. CreateViewModel();
  285. string propertyChangedName = null;
  286. viewModel.PropertyChanged += (sender, e) => propertyChangedName = e.PropertyName;
  287. viewModel.RemovePackage();
  288. viewModel.PackageChanged();
  289. Assert.AreEqual("IsAdded", propertyChangedName);
  290. }
  291. [Test]
  292. public void PackageChanged_PackageRemovedSuccessfully_PropertyNotifyChangedFiredAfterPackageUninstalled()
  293. {
  294. CreateViewModel();
  295. IPackage packagePassedToUninstallPackageWhenPropertyNameChanged = null;
  296. viewModel.PropertyChanged += (sender, e) => {
  297. packagePassedToUninstallPackageWhenPropertyNameChanged = fakeUninstallPackageAction.Package;
  298. };
  299. viewModel.RemovePackage();
  300. viewModel.PackageChanged();
  301. Assert.AreEqual(fakePackage, packagePassedToUninstallPackageWhenPropertyNameChanged);
  302. }
  303. [Test]
  304. public void HasDependencies_PackageHasNoDependencies_ReturnsFalse()
  305. {
  306. CreateViewModel();
  307. fakePackage.HasDependencies = false;
  308. Assert.IsFalse(viewModel.HasDependencies);
  309. }
  310. [Test]
  311. public void HasDependencies_PackageHasDependency_ReturnsTrue()
  312. {
  313. CreateViewModel();
  314. fakePackage.HasDependencies = true;
  315. Assert.IsTrue(viewModel.HasDependencies);
  316. }
  317. [Test]
  318. public void HasNoDependencies_PackageHasNoDependencies_ReturnsTrue()
  319. {
  320. CreateViewModel();
  321. fakePackage.HasDependencies = false;
  322. Assert.IsTrue(viewModel.HasNoDependencies);
  323. }
  324. [Test]
  325. public void HasNoDependencies_PackageHasOneDependency_ReturnsFalse()
  326. {
  327. CreateViewModel();
  328. fakePackage.HasDependencies = true;
  329. Assert.IsFalse(viewModel.HasNoDependencies);
  330. }
  331. [Test]
  332. public void HasDownloadCount_DownloadCountIsZero_ReturnsTrue()
  333. {
  334. CreateViewModel();
  335. fakePackage.DownloadCount = 0;
  336. Assert.IsTrue(viewModel.HasDownloadCount);
  337. }
  338. [Test]
  339. public void HasDownloadCount_DownloadCountIsMinusOne_ReturnsFalse()
  340. {
  341. CreateViewModel();
  342. fakePackage.DownloadCount = -1;
  343. Assert.IsFalse(viewModel.HasDownloadCount);
  344. }
  345. [Test]
  346. public void HasLastPublished_PackageHasPublishedDate_ReturnsTrue()
  347. {
  348. CreateViewModel();
  349. fakePackage.Published = new DateTime(2011, 1, 2);
  350. Assert.IsTrue(viewModel.HasLastPublished);
  351. }
  352. [Test]
  353. public void HasLastPublished_PackageHasNoPublishedDate_ReturnsFalse()
  354. {
  355. CreateViewModel();
  356. fakePackage.Published = null;
  357. Assert.IsFalse(viewModel.HasLastPublished);
  358. }
  359. [Test]
  360. public void LastPublished_PackageHasPublishedDate_ReturnsPackagePublishedDate()
  361. {
  362. CreateViewModel();
  363. fakePackage.Published = new DateTime(2011, 1, 2);
  364. Assert.AreEqual(fakePackage.Published, viewModel.LastPublished);
  365. }
  366. [Test]
  367. public void LastPublished_PackageHasNoPublishedDate_ReturnsNull()
  368. {
  369. CreateViewModel();
  370. fakePackage.Published = null;
  371. Assert.IsNull(viewModel.LastPublished);
  372. }
  373. [Test]
  374. public void AddPackage_PackageRequiresLicenseAgreementAcceptance_UserAskedToAcceptLicenseAgreementForPackageBeforeInstalling()
  375. {
  376. CreateViewModel();
  377. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  378. fakePackage.RequireLicenseAcceptance = true;
  379. fakePackageManagementEvents.OnAcceptLicensesReturnValue = true;
  380. viewModel.AddPackage();
  381. var expectedPackages = new FakePackage[] {
  382. fakePackage
  383. };
  384. IEnumerable<IPackage> actualPackages = fakePackageManagementEvents.LastPackagesPassedToOnAcceptLicenses;
  385. CollectionAssert.AreEqual(expectedPackages, actualPackages);
  386. }
  387. [Test]
  388. public void AddPackage_PackageRequiresLicenseAgreementAcceptanceButPackageInstalledInSolutionAlready_UserNotAskedToAcceptLicenseAgreementForPackageBeforeInstalling()
  389. {
  390. CreateViewModel();
  391. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  392. fakePackage.RequireLicenseAcceptance = true;
  393. fakePackageManagementEvents.OnAcceptLicensesReturnValue = true;
  394. fakeSolution.FakeInstalledPackages.Add(fakePackage);
  395. viewModel.AddPackage();
  396. bool acceptLicenses = fakePackageManagementEvents.IsOnAcceptLicensesCalled;
  397. Assert.IsFalse(acceptLicenses);
  398. }
  399. [Test]
  400. public void AddPackage_PackageDoesNotRequireLicenseAgreementAcceptance_UserNotAskedToAcceptLicenseAgreementBeforeInstalling()
  401. {
  402. CreateViewModel();
  403. fakePackage.RequireLicenseAcceptance = false;
  404. viewModel.AddPackage();
  405. Assert.IsFalse(fakePackageManagementEvents.IsOnAcceptLicensesCalled);
  406. }
  407. [Test]
  408. public void AddPackage_PackageRequiresLicenseAgreementAcceptanceAndUserDeclinesAgreement_PackageIsNotInstalled()
  409. {
  410. CreateViewModel();
  411. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  412. fakePackage.RequireLicenseAcceptance = true;
  413. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  414. viewModel.AddPackage();
  415. FakeInstallPackageAction action = fakeSolution.FakeProjectToReturnFromGetProject.LastInstallPackageCreated;
  416. Assert.IsFalse(action.IsExecuteCalled);
  417. }
  418. [Test]
  419. public void AddPackage_PackageRequiresLicenseAgreementAcceptanceAndUserDeclinesAgreement_PropertyChangedEventNotFired()
  420. {
  421. CreateViewModel();
  422. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  423. fakePackage.RequireLicenseAcceptance = true;
  424. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  425. bool propertyChangedEventFired = false;
  426. viewModel.PropertyChanged += (sender, e) => propertyChangedEventFired = true;
  427. viewModel.AddPackage();
  428. Assert.IsFalse(propertyChangedEventFired);
  429. }
  430. [Test]
  431. public void AddPackage_OnePackageOperationIsToUninstallPackageWhichRequiresLicenseAcceptance_UserIsNotAskedToAcceptLicenseAgreementForPackageToBeUninstalled()
  432. {
  433. CreateViewModel();
  434. fakePackage.RequireLicenseAcceptance = false;
  435. PackageOperation operation = viewModel.AddOneFakeUninstallPackageOperation();
  436. FakePackage packageToUninstall = operation.Package as FakePackage;
  437. packageToUninstall.RequireLicenseAcceptance = true;
  438. viewModel.AddPackage();
  439. Assert.IsFalse(fakePackageManagementEvents.IsOnAcceptLicensesCalled);
  440. }
  441. [Test]
  442. public void AddPackage_CheckLoggerUsed_PackageViewModelLoggerUsedWhenResolvingPackageOperations()
  443. {
  444. CreateViewModel();
  445. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  446. viewModel.AddPackage();
  447. ILogger expectedLogger = viewModel.OperationLoggerCreated;
  448. ILogger actualLogger = fakeSolution.FakeProjectToReturnFromGetProject.Logger;
  449. Assert.AreEqual(expectedLogger, actualLogger);
  450. }
  451. [Test]
  452. public void AddPackage_PackageAddedSuccessfully_InstallingPackageMessageIsFirstMessageLogged()
  453. {
  454. CreateViewModel();
  455. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  456. fakePackage.Id = "Test.Package";
  457. fakePackage.Version = new SemanticVersion(1, 2, 0, 55);
  458. viewModel.AddPackage();
  459. string expectedMessage = "------- Installing...Test.Package 1.2.0.55 -------";
  460. string actualMessage = fakeLogger.FirstFormattedMessageLogged;
  461. Assert.AreEqual(expectedMessage, actualMessage);
  462. }
  463. [Test]
  464. public void AddPackage_PackageAddedSuccessfully_NextToLastMessageLoggedMarksEndOfInstallation()
  465. {
  466. CreateViewModel();
  467. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  468. viewModel.AddPackage();
  469. string expectedMessage = "==============================";
  470. string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
  471. Assert.AreEqual(expectedMessage, actualMessage);
  472. }
  473. [Test]
  474. public void AddPackage_PackageAddedSuccessfully_LastMessageLoggedIsEmptyLine()
  475. {
  476. CreateViewModel();
  477. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  478. viewModel.AddPackage();
  479. string expectedMessage = String.Empty;
  480. string actualMessage = fakeLogger.LastFormattedMessageLogged;
  481. Assert.AreEqual(expectedMessage, actualMessage);
  482. }
  483. [Test]
  484. public void RemovePackage_PackageRemovedSuccessfully_UninstallingPackageMessageIsFirstMessageLogged()
  485. {
  486. CreateViewModel();
  487. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  488. fakePackage.Id = "Test.Package";
  489. fakePackage.Version = new SemanticVersion(1, 2, 0, 55);
  490. viewModel.RemovePackage();
  491. string expectedMessage = "------- Uninstalling...Test.Package 1.2.0.55 -------";
  492. string actualMessage = fakeLogger.FirstFormattedMessageLogged;
  493. Assert.AreEqual(expectedMessage, actualMessage);
  494. }
  495. [Test]
  496. public void RemovePackage_PackageRemovedSuccessfully_NextToLastMessageLoggedMarksEndOfInstallation()
  497. {
  498. CreateViewModel();
  499. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  500. viewModel.RemovePackage();
  501. string expectedMessage = "==============================";
  502. string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
  503. Assert.AreEqual(expectedMessage, actualMessage);
  504. }
  505. [Test]
  506. public void RemovePackage_PackageRemovedSuccessfully_LastMessageLoggedIsEmptyLine()
  507. {
  508. CreateViewModel();
  509. viewModel.RemovePackage();
  510. string expectedMessage = String.Empty;
  511. string actualMessage = fakeLogger.LastFormattedMessageLogged;
  512. Assert.AreEqual(expectedMessage, actualMessage);
  513. }
  514. [Test]
  515. public void AddPackage_ExceptionWhenInstallingPackage_ExceptionErrorMessageReported()
  516. {
  517. CreateViewModelWithExceptionThrowingProject();
  518. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  519. Exception ex = new Exception("Test");
  520. exceptionThrowingProject.ExceptionToThrowWhenCreateInstallPackageActionCalled = ex;
  521. viewModel.AddPackage();
  522. Assert.AreEqual(ex, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
  523. }
  524. [Test]
  525. public void AddPackage_PackageAddedSuccessfully_MessagesReportedPreviouslyAreCleared()
  526. {
  527. CreateViewModel();
  528. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  529. viewModel.AddPackage();
  530. Assert.IsTrue(fakePackageManagementEvents.IsOnPackageOperationsStartingCalled);
  531. }
  532. [Test]
  533. public void AddPackage_ExceptionWhenInstallingPackage_ExceptionLogged()
  534. {
  535. CreateViewModelWithExceptionThrowingProject();
  536. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  537. Exception ex = new Exception("Exception error message");
  538. exceptionThrowingProject.ExceptionToThrowWhenCreateInstallPackageActionCalled = ex;
  539. viewModel.AddPackage();
  540. string actualMessage = fakeLogger.SecondFormattedMessageLogged;
  541. bool containsExceptionErrorMessage = actualMessage.Contains("Exception error message");
  542. Assert.IsTrue(containsExceptionErrorMessage, actualMessage);
  543. }
  544. [Test]
  545. public void RemovePackage_ExceptionWhenUninstallingPackage_ExceptionErrorMessageReported()
  546. {
  547. CreateViewModelWithExceptionThrowingProject();
  548. Exception ex = new Exception("Test");
  549. exceptionThrowingProject.ExceptionToThrowWhenCreateUninstallPackageActionCalled = ex;
  550. viewModel.RemovePackage();
  551. Assert.AreEqual(ex, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
  552. }
  553. [Test]
  554. public void RemovePackage_PackageUninstalledSuccessfully_MessagesReportedPreviouslyAreCleared()
  555. {
  556. CreateViewModel();
  557. viewModel.RemovePackage();
  558. Assert.IsTrue(fakePackageManagementEvents.IsOnPackageOperationsStartingCalled);
  559. }
  560. [Test]
  561. public void RemovePackage_ExceptionWhenUninstallingPackage_ExceptionLogged()
  562. {
  563. CreateViewModelWithExceptionThrowingProject();
  564. Exception ex = new Exception("Exception error message");
  565. exceptionThrowingProject.ExceptionToThrowWhenCreateUninstallPackageActionCalled = ex;
  566. viewModel.RemovePackage();
  567. string actualMessage = fakeLogger.SecondFormattedMessageLogged;
  568. bool containsExceptionErrorMessage = actualMessage.Contains("Exception error message");
  569. Assert.IsTrue(containsExceptionErrorMessage, actualMessage);
  570. }
  571. [Test]
  572. public void AddPackage_ExceptionThrownWhenResolvingPackageOperations_ExceptionReported()
  573. {
  574. CreateViewModelWithExceptionThrowingSolution();
  575. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  576. var exception = new Exception("Test");
  577. exceptionThrowingSolution.ExceptionToThrowWhenGetProjectCalled = exception;
  578. viewModel.AddPackage();
  579. Assert.AreEqual(exception, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
  580. }
  581. [Test]
  582. public void AddPackage_PackagesInstalledSuccessfully_ViewModelPackageUsedWhenResolvingPackageOperations()
  583. {
  584. CreateViewModel();
  585. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  586. viewModel.AddPackage();
  587. FakePackage expectedPackage = fakePackage;
  588. IPackage actualPackage = fakeSolution
  589. .FakeProjectToReturnFromGetProject
  590. .PackagePassedToGetInstallPackageOperations;
  591. Assert.AreEqual(expectedPackage, actualPackage);
  592. }
  593. [Test]
  594. public void AddPackage_PackagesInstalledSuccessfully_PackageDependenciesNotIgnoredWhenCheckingForPackageOperations()
  595. {
  596. CreateViewModel();
  597. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  598. viewModel.AddPackage();
  599. bool result = fakeSolution
  600. .FakeProjectToReturnFromGetProject
  601. .IgnoreDependenciesPassedToGetInstallPackageOperations;
  602. Assert.IsFalse(result);
  603. }
  604. [Test]
  605. public void AddPackage_PackagesInstalledSuccessfully_PrereleaseVersionsNotAllowedWhenCheckingForPackageOperations()
  606. {
  607. CreateViewModel();
  608. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  609. viewModel.AddPackage();
  610. bool result = fakeSolution
  611. .FakeProjectToReturnFromGetProject
  612. .AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
  613. Assert.IsFalse(result);
  614. }
  615. [Test]
  616. public void AddPackage_ParentHasIncludePrereleaseSetToTrueWhenInstalling_PrereleaseVersionsAllowedWhenCheckingForPackageOperations()
  617. {
  618. CreateViewModel();
  619. ParentAllowsPrereleasePackages();
  620. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  621. viewModel.AddPackage();
  622. bool result = fakeSolution
  623. .FakeProjectToReturnFromGetProject
  624. .AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
  625. Assert.IsTrue(result);
  626. }
  627. [Test]
  628. public void RemovePackage_PackageRemovedSuccessfully_PackageIsRemoved()
  629. {
  630. CreateViewModel();
  631. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  632. viewModel.RemovePackage();
  633. IPackageAction actionExecuted = fakeActionRunner.ActionPassedToRun;
  634. Assert.AreEqual(fakeUninstallPackageAction, actionExecuted);
  635. }
  636. [Test]
  637. public void IsAdded_SolutionSelectedContainingOneProjectAndPackageIsInstalledInSolutionSharedRepository_ReturnsTrue()
  638. {
  639. CreateFakeSolution();
  640. AddProjectToSolution();
  641. fakeSolution.NoProjectsSelected();
  642. fakeSolution.FakeInstalledPackages.Add(fakePackage);
  643. CreateViewModel(fakeSolution);
  644. bool added = viewModel.IsAdded;
  645. Assert.IsTrue(added);
  646. }
  647. [Test]
  648. public void IsAdded_SolutionSelectedContainingOneProjectAndPackageIsNotInstalledInSolutionSharedRepository_ReturnsFalse()
  649. {
  650. CreateViewModel();
  651. AddProjectToSolution();
  652. fakeSolution.NoProjectsSelected();
  653. bool added = viewModel.IsAdded;
  654. Assert.IsFalse(added);
  655. }
  656. [Test]
  657. public void IsManaged_SolutionSelectedContainingTwoProjects_ReturnsFalsew()
  658. {
  659. CreateFakeSolution();
  660. AddProjectToSolution();
  661. AddProjectToSolution();
  662. fakeSolution.NoProjectsSelected();
  663. CreateViewModel(fakeSolution);
  664. bool managed = viewModel.IsManaged;
  665. // Only installed project-level package "IsManaged"
  666. Assert.IsFalse(managed);
  667. }
  668. [Test]
  669. public void IsManaged_SolutionSelectedContainingOneProject_ReturnsFalse()
  670. {
  671. CreateFakeSolution();
  672. AddProjectToSolution();
  673. fakeSolution.NoProjectsSelected();
  674. CreateViewModel(fakeSolution);
  675. bool managed = viewModel.IsManaged;
  676. Assert.IsFalse(managed);
  677. }
  678. [Test]
  679. public void IsManaged_SolutionWithOneProjectSelected_ReturnsFalse()
  680. {
  681. CreateFakeSolution();
  682. AddProjectToSolution();
  683. fakeSolution.FakeActiveMSBuildProject = fakeSolution.FakeMSBuildProjects[0];
  684. CreateViewModel(fakeSolution);
  685. bool managed = viewModel.IsManaged;
  686. Assert.IsFalse(managed);
  687. }
  688. [Test]
  689. public void ManagePackageCommand_TwoProjectsSelectedAndCommandExecuted_UserPromptedToSelectTwoProjects()
  690. {
  691. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  692. UserCancelsProjectSelection();
  693. viewModel.ManagePackageCommand.Execute(null);
  694. IEnumerable<IPackageManagementSelectedProject> selectedProjects =
  695. fakePackageManagementEvents.SelectedProjectsPassedToOnSelectProjects;
  696. var expectedSelectedProjects = new List<IPackageManagementSelectedProject>();
  697. expectedSelectedProjects.Add(new FakeSelectedProject("Project A"));
  698. expectedSelectedProjects.Add(new FakeSelectedProject("Project B"));
  699. SelectedProjectCollectionAssert.AreEqual(expectedSelectedProjects, selectedProjects);
  700. }
  701. [Test]
  702. public void ManagePackage_TwoProjectsSelectedAndUserAcceptsSelectedProjects_MessagesReportedPreviouslyAreCleared()
  703. {
  704. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  705. UserAcceptsProjectSelection();
  706. viewModel.ManagePackage();
  707. Assert.IsTrue(fakePackageManagementEvents.IsOnPackageOperationsStartingCalled);
  708. }
  709. [Test]
  710. public void ManagePackage_TwoProjectsSelectedAndUserCancelsSelectedProjects_MessagesReportedPreviouslyAreNotCleared()
  711. {
  712. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  713. UserCancelsProjectSelection();
  714. viewModel.ManagePackage();
  715. Assert.IsFalse(fakePackageManagementEvents.IsOnPackageOperationsStartingCalled);
  716. }
  717. [Test]
  718. public void PackageChanged_TwoProjectsSelectedAndUserAcceptsSelectedProjects_IsAddedPropertyChanged()
  719. {
  720. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  721. viewModel.FakePackageManagementEvents.ProjectsToSelect.Add("Project A");
  722. viewModel.FakePackageManagementEvents.ProjectsToSelect.Add("Project B");
  723. UserAcceptsProjectSelection();
  724. string propertyChangedName = null;
  725. viewModel.PropertyChanged += (sender, e) => propertyChangedName = e.PropertyName;
  726. viewModel.ManagePackage();
  727. viewModel.PackageChanged();
  728. Assert.AreEqual("IsAdded", propertyChangedName);
  729. }
  730. [Test]
  731. public void ManagePackage_TwoProjectsSelectedAndUserAcceptsSelectedProjects_NextToLastMessageLoggedMarksEndOfInstallation()
  732. {
  733. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  734. UserAcceptsProjectSelection();
  735. viewModel.ManagePackage();
  736. string expectedMessage = "==============================";
  737. string actualMessage = fakeLogger.NextToLastFormattedMessageLogged;
  738. Assert.AreEqual(expectedMessage, actualMessage);
  739. }
  740. [Test]
  741. public void ManagePackage_TwoProjectsSelectedAndUserAcceptsSelectedProjects_LastMessageLoggedIsEmptyLine()
  742. {
  743. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  744. UserAcceptsProjectSelection();
  745. viewModel.ManagePackage();
  746. string expectedMessage = String.Empty;
  747. string actualMessage = fakeLogger.LastFormattedMessageLogged;
  748. Assert.AreEqual(expectedMessage, actualMessage);
  749. }
  750. [Test]
  751. public void ManagePackagesForSelectedProjects_OneProjectIsSelected_OneProjectIsInstalled()
  752. {
  753. CreateViewModel();
  754. CreateTwoFakeSelectedProjects();
  755. FakeSelectedProject project = fakeSelectedProjects[1];
  756. project.IsSelected = true;
  757. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  758. List<IPackageAction> actions = fakeActionRunner.GetActionsRunInOneCallAsList();
  759. InstallPackageAction action = actions[0] as InstallPackageAction;
  760. InstallPackageAction expectedAction = project.FakeProject.LastInstallPackageCreated;
  761. Assert.AreEqual(1, actions.Count);
  762. Assert.AreEqual(fakePackage, action.Package);
  763. Assert.AreEqual(expectedAction, action);
  764. }
  765. [Test]
  766. public void ManagePackagesForSelectedProjects_ParentAllowsPrereleasePackagesAndOneProjectIsSelected_OneProjectIsInstalledAllowingPrereleasePackages()
  767. {
  768. CreateViewModel();
  769. CreateTwoFakeSelectedProjects();
  770. ParentAllowsPrereleasePackages();
  771. FakeSelectedProject project = fakeSelectedProjects[1];
  772. project.IsSelected = true;
  773. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  774. List<IPackageAction> actions = fakeActionRunner.GetActionsRunInOneCallAsList();
  775. InstallPackageAction action = actions[0] as InstallPackageAction;
  776. Assert.IsTrue(action.AllowPrereleaseVersions);
  777. }
  778. [Test]
  779. public void ManagePackagesForSelectedProjects_ParentDoesNotAllowPrereleasePackagesAndOneProjectIsSelected_OneProjectIsInstalledNotAllowingPrereleasePackages()
  780. {
  781. CreateViewModel();
  782. CreateTwoFakeSelectedProjects();
  783. FakeSelectedProject project = fakeSelectedProjects[1];
  784. project.IsSelected = true;
  785. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  786. List<IPackageAction> actions = fakeActionRunner.GetActionsRunInOneCallAsList();
  787. InstallPackageAction action = actions[0] as InstallPackageAction;
  788. Assert.IsFalse(action.AllowPrereleaseVersions);
  789. }
  790. [Test]
  791. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndPackageOperationRequiresLicenseAcceptance_UserPromptedToAcceptLicenses()
  792. {
  793. CreateViewModel();
  794. CreateTwoFakeSelectedProjects();
  795. FakeSelectedProject selectedProject = fakeSelectedProjects[0];
  796. selectedProject.IsSelected = true;
  797. FakePackageOperation operation = selectedProject.AddFakeInstallPackageOperation();
  798. operation.FakePackage.RequireLicenseAcceptance = true;
  799. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  800. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  801. var expectedPackages = new FakePackage[] {
  802. operation.FakePackage
  803. };
  804. List<IPackage> actualPackages = fakePackageManagementEvents.GetPackagesPassedToOnAcceptLicensesAsList();
  805. CollectionAssert.AreEqual(expectedPackages, actualPackages);
  806. }
  807. [Test]
  808. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndPackageOperationRequiresLicenseAcceptance_PackageInViewModelUsedToGetPackageOperations()
  809. {
  810. CreateViewModel();
  811. CreateTwoFakeSelectedProjects();
  812. FakeSelectedProject selectedProject = fakeSelectedProjects[0];
  813. selectedProject.IsSelected = true;
  814. FakePackageOperation operation = selectedProject.AddFakeInstallPackageOperation();
  815. operation.FakePackage.RequireLicenseAcceptance = true;
  816. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  817. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  818. IPackage actualPackage = selectedProject.FakeProject.PackagePassedToGetInstallPackageOperations;
  819. Assert.AreEqual(fakePackage, actualPackage);
  820. }
  821. [Test]
  822. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndPackageOperationRequiresLicenseAcceptance_PackageDependenciesAreNotIgnored()
  823. {
  824. CreateViewModel();
  825. CreateTwoFakeSelectedProjects();
  826. FakeSelectedProject selectedProject = fakeSelectedProjects[0];
  827. selectedProject.IsSelected = true;
  828. FakePackageOperation operation = selectedProject.AddFakeInstallPackageOperation();
  829. operation.FakePackage.RequireLicenseAcceptance = true;
  830. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  831. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  832. bool ignored = selectedProject.FakeProject.IgnoreDependenciesPassedToGetInstallPackageOperations;
  833. Assert.IsFalse(ignored);
  834. }
  835. [Test]
  836. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndPackageOperationRequiresLicenseAcceptance_PrereleaseVersionsAreNotAllowed()
  837. {
  838. CreateViewModel();
  839. CreateTwoFakeSelectedProjects();
  840. FakeSelectedProject selectedProject = fakeSelectedProjects[0];
  841. selectedProject.IsSelected = true;
  842. FakePackageOperation operation = selectedProject.AddFakeInstallPackageOperation();
  843. operation.FakePackage.RequireLicenseAcceptance = true;
  844. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  845. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  846. bool allowed = selectedProject.FakeProject.AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
  847. Assert.IsFalse(allowed);
  848. }
  849. [Test]
  850. public void ManagePackagesForSelectedProjects_ParentAllowsPrereleasesAndFirstProjectIsSelectedAndPackageOperationRequiresLicenseAcceptance_PrereleaseVersionsAreAllowedInPackageOperations()
  851. {
  852. CreateViewModel();
  853. CreateTwoFakeSelectedProjects();
  854. FakeSelectedProject selectedProject = fakeSelectedProjects[0];
  855. selectedProject.IsSelected = true;
  856. FakePackageOperation operation = selectedProject.AddFakeInstallPackageOperation();
  857. operation.FakePackage.RequireLicenseAcceptance = true;
  858. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  859. ParentAllowsPrereleasePackages();
  860. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  861. bool allowed = selectedProject.FakeProject.AllowPrereleaseVersionsPassedToGetInstallPackageOperations;
  862. Assert.IsTrue(allowed);
  863. }
  864. [Test]
  865. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndTwoPackageOperationsRequireLicenseAcceptance_UserPromptedToAcceptLicensesForTwoPackages()
  866. {
  867. CreateViewModel();
  868. CreateTwoFakeSelectedProjects();
  869. FirstFakeSelectedProject.IsSelected = true;
  870. FakePackageOperation firstOperation =
  871. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  872. FakePackageOperation secondOperation =
  873. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  874. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  875. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  876. var expectedPackages = new FakePackage[] {
  877. firstOperation.FakePackage,
  878. secondOperation.FakePackage
  879. };
  880. List<IPackage> actualPackages = fakePackageManagementEvents.GetPackagesPassedToOnAcceptLicensesAsList();
  881. CollectionAssert.AreEqual(expectedPackages, actualPackages);
  882. }
  883. [Test]
  884. public void ManagePackagesForSelectedProjects_TwoPackageOperationsRequireLicenseAcceptanceButOneIsUninstallPackageOperation_UserPromptedToAcceptLicenseForInstallPackageOperationOnly()
  885. {
  886. CreateViewModel();
  887. CreateTwoFakeSelectedProjects();
  888. FirstFakeSelectedProject.IsSelected = true;
  889. FakePackageOperation installOperation =
  890. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  891. AddFakeUninstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  892. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  893. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  894. var expectedPackages = new FakePackage[] {
  895. installOperation.FakePackage
  896. };
  897. List<IPackage> actualPackages = fakePackageManagementEvents.GetPackagesPassedToOnAcceptLicensesAsList();
  898. CollectionAssert.AreEqual(expectedPackages, actualPackages);
  899. }
  900. [Test]
  901. public void ManagePackagesForSelectedProjects_OneInstallPackageOperationsDoesNotRequireLicenseAcceptance_UserIsNotPromptedToAcceptLicense()
  902. {
  903. CreateViewModel();
  904. CreateTwoFakeSelectedProjects();
  905. FirstFakeSelectedProject.IsSelected = true;
  906. AddFakeInstallPackageOperationWithPackageThatDoesNotRequireLicenseAcceptance(FirstFakeSelectedProject);
  907. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  908. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  909. Assert.IsFalse(fakePackageManagementEvents.IsOnAcceptLicensesCalled);
  910. }
  911. [Test]
  912. public void ManagePackagesForSelectedProjects_OneInstallPackageOperationsRequiresLicenseAcceptanceButIsInstalledInSolutionAlready_UserIsNotPromptedToAcceptLicense()
  913. {
  914. CreateViewModel();
  915. CreateTwoFakeSelectedProjects();
  916. FirstFakeSelectedProject.IsSelected = true;
  917. FakePackageOperation installOperation =
  918. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  919. fakeSolution.FakeInstalledPackages.Add(installOperation.FakePackage);
  920. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  921. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  922. Assert.IsFalse(fakePackageManagementEvents.IsOnAcceptLicensesCalled);
  923. }
  924. [Test]
  925. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndUserDoesNotAcceptPackageLicense_PackageIsNotInstalled()
  926. {
  927. CreateViewModel();
  928. CreateTwoFakeSelectedProjects();
  929. FirstFakeSelectedProject.IsSelected = true;
  930. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  931. fakePackageManagementEvents.OnAcceptLicensesReturnValue = false;
  932. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  933. Assert.IsFalse(fakeActionRunner.IsRunCalled);
  934. }
  935. [Test]
  936. public void ManagePackagesForSelectedProjects_TwoProjectsButNeitherIsSelected_NoPackageActionsAreRun()
  937. {
  938. CreateViewModel();
  939. CreateTwoFakeSelectedProjects();
  940. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  941. Assert.IsFalse(fakeActionRunner.IsRunCalled);
  942. }
  943. [Test]
  944. public void ManagePackagesForSelectedProjects_FirstProjectIsSelectedAndUserAcceptsPackageLicense_PackageIsInstalled()
  945. {
  946. CreateViewModel();
  947. CreateTwoFakeSelectedProjects();
  948. FirstFakeSelectedProject.IsSelected = true;
  949. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  950. fakePackageManagementEvents.OnAcceptLicensesReturnValue = true;
  951. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  952. InstallPackageAction expectedAction = FirstFakeSelectedProject.FakeProject.LastInstallPackageCreated;
  953. List<IPackageAction> actions = fakeActionRunner.GetActionsRunInOneCallAsList();
  954. InstallPackageAction action = actions[0] as InstallPackageAction;
  955. Assert.AreEqual(1, actions.Count);
  956. Assert.AreEqual(fakePackage, action.Package);
  957. Assert.AreEqual(expectedAction, action);
  958. }
  959. [Test]
  960. public void ManagePackagesForSelectedProjects_TwoProjectsAreSelectedAndUserAcceptsPackageLicense_UserIsNotPromptedTwiceToAcceptLicenses()
  961. {
  962. CreateViewModel();
  963. CreateTwoFakeSelectedProjects();
  964. FirstFakeSelectedProject.IsSelected = true;
  965. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  966. SecondFakeSelectedProject.IsSelected = true;
  967. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(SecondFakeSelectedProject);
  968. fakePackageManagementEvents.OnAcceptLicensesReturnValue = true;
  969. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  970. List<IEnumerable<IPackage>> packagesPassedToAcceptLicenses =
  971. fakePackageManagementEvents.PackagesPassedToAcceptLicenses;
  972. Assert.AreEqual(1, packagesPassedToAcceptLicenses.Count);
  973. }
  974. [Test]
  975. public void ManagePackagesForSelectedProjects_FirstProjectSelectedAndExceptionThrownWhenResolvingPackageOperations_ExceptionReported()
  976. {
  977. CreateViewModel();
  978. CreateTwoFakeSelectedProjects();
  979. FirstFakeSelectedProject.IsSelected = true;
  980. var exceptionThrowingProject = new ExceptionThrowingPackageManagementProject();
  981. FirstFakeSelectedProject.FakeProject = exceptionThrowingProject;
  982. AddFakeInstallPackageOperationWithPackageThatDoesNotRequireLicenseAcceptance(FirstFakeSelectedProject);
  983. var exception = new Exception("Test");
  984. exceptionThrowingProject.ExceptionToThrowWhenGetInstallPackageOperationsCalled = exception;
  985. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  986. Assert.AreEqual(exception, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
  987. }
  988. [Test]
  989. public void ManagePackagesForSelectedProjects_FirstProjectSelectedAndExceptionThrownWhenCreatingInstallAction_ExceptionLogged()
  990. {
  991. CreateViewModel();
  992. CreateTwoFakeSelectedProjects();
  993. FirstFakeSelectedProject.IsSelected = true;
  994. var exceptionThrowingProject = new ExceptionThrowingPackageManagementProject();
  995. FirstFakeSelectedProject.FakeProject = exceptionThrowingProject;
  996. AddFakeInstallPackageOperationWithPackageThatDoesNotRequireLicenseAcceptance(FirstFakeSelectedProject);
  997. var exception = new Exception("Exception error message");
  998. exceptionThrowingProject.ExceptionToThrowWhenCreateInstallPackageActionCalled = exception;
  999. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  1000. bool contains = fakeLogger.FormattedMessagesLoggedContainsText("Exception error message");
  1001. Assert.IsTrue(contains);
  1002. }
  1003. [Test]
  1004. public void ManagePackagesForSelectedProjects_TwoProjectsOneSelectedAndPackageRequiresLicenseAcceptance_PackageViewModelLoggerUsedWhenResolvingPackageOperations()
  1005. {
  1006. CreateViewModel();
  1007. CreateTwoFakeSelectedProjects();
  1008. FirstFakeSelectedProject.IsSelected = true;
  1009. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  1010. fakePackageManagementEvents.OnAcceptLicensesReturnValue = true;
  1011. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  1012. ILogger expectedLogger = viewModel.OperationLoggerCreated;
  1013. ILogger actualLogger = FirstFakeSelectedProject.Project.Logger;
  1014. Assert.AreEqual(expectedLogger, actualLogger);
  1015. }
  1016. [Test]
  1017. public void ManagePackage_UserAcceptsProjectSelection_ManagingPackageMessageIsFirstMessageLogged()
  1018. {
  1019. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  1020. UserAcceptsProjectSelection();
  1021. fakePackage.Id = "Test.Package";
  1022. fakePackage.Version = new SemanticVersion(1, 2, 0, 55);
  1023. viewModel.ManagePackage();
  1024. string expectedMessage = "------- Managing...Test.Package 1.2.0.55 -------";
  1025. string actualMessage = fakeLogger.FirstFormattedMessageLogged;
  1026. Assert.AreEqual(expectedMessage, actualMessage);
  1027. }
  1028. [Test]
  1029. public void ManagePackagesForSelectedProjects_TwoProjectsNoneSelectedAndFirstPackageHasLicense_UserIsNotPromptedToAcceptLicense()
  1030. {
  1031. CreateViewModel();
  1032. CreateTwoFakeSelectedProjects();
  1033. AddFakeInstallPackageOperationWithPackageThatRequiresLicenseAcceptance(FirstFakeSelectedProject);
  1034. viewModel.ManagePackagesForSelectedProjects(fakeSelectedProjects);
  1035. Assert.IsFalse(fakePackageManagementEvents.IsOnAcceptLicensesCalled);
  1036. }
  1037. [Test]
  1038. public void ManagePackage_TwoProjectsAndFirstSelectedInDialog_PackageIsInstalled()
  1039. {
  1040. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  1041. UserAcceptsProjectSelection();
  1042. fakePackageManagementEvents.ProjectsToSelect.Add("Project A");
  1043. viewModel.ManagePackage();
  1044. List<IPackageAction> actions = fakeActionRunner.GetActionsRunInOneCallAsList();
  1045. var action = actions[0] as ProcessPackageAction;
  1046. FakePackageManagementProject expectedProject = fakeSolution.FakeProjectsToReturnFromGetProject["Project A"];
  1047. Assert.AreEqual(expectedProject, action.Project);
  1048. }
  1049. [Test]
  1050. public void ManagePackage_TwoProjectsAndSecondSelectedInDialog_ProjectHasLoggerSet()
  1051. {
  1052. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  1053. UserAcceptsProjectSelection();
  1054. fakePackageManagementEvents.ProjectsToSelect.Add("Project B");
  1055. viewModel.ManagePackage();
  1056. FakePackageManagementProject project = fakeSolution.FakeProjectsToReturnFromGetProject["Project B"];
  1057. ILogger expectedLogger = viewModel.OperationLoggerCreated;
  1058. ILogger actualLogger = project.Logger;
  1059. Assert.AreEqual(expectedLogger, actualLogger);
  1060. }
  1061. [Test]
  1062. public void Summary_PackageHasSummary_PackageSummaryReturned()
  1063. {
  1064. CreateViewModel();
  1065. fakePackage.Summary = "Expected summary";
  1066. string summary = viewModel.Summary;
  1067. Assert.AreEqual("Expected summary", summary);
  1068. }
  1069. [Test]
  1070. public void Summary_PackageHasDescriptionButNoSummary_PackageDescriptionReturned()
  1071. {
  1072. CreateViewModel();
  1073. fakePackage.Summary = String.Empty;
  1074. fakePackage.Description = "Expected description";
  1075. string summary = viewModel.Summary;
  1076. Assert.AreEqual("Expected description", summary);
  1077. }
  1078. [Test]
  1079. public void AddPackage_ParentAllowsPrereleasePackages_PackageIsInstalledAllowingPrereleasePackages()
  1080. {
  1081. CreateViewModel();
  1082. ParentAllowsPrereleasePackages();
  1083. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  1084. viewModel.AddPackage();
  1085. var action = fakeActionRunner.ActionPassedToRun as InstallPackageAction;
  1086. Assert.IsTrue(action.AllowPrereleaseVersions);
  1087. }
  1088. [Test]
  1089. public void AddPackage_ParentDoesNotAllowPrereleasePackages_PackageIsInstalledNotAllowingPrereleasePackages()
  1090. {
  1091. CreateViewModel();
  1092. viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
  1093. viewModel.AddPackage();
  1094. var action = fakeActionRunner.ActionPassedToRun as InstallPackageAction;
  1095. Assert.IsFalse(action.AllowPrereleaseVersions);
  1096. }
  1097. [Test]
  1098. public void Name_PackageHasIdButNoTitle_ReturnsPackageId()
  1099. {
  1100. CreateViewModel();
  1101. fakePackage.Id = "MyPackage";
  1102. string name = viewModel.Name;
  1103. Assert.AreEqual("MyPackage", name);
  1104. }
  1105. [Test]
  1106. public void Name_PackageHasIdAndTitle_ReturnsPackageId()
  1107. {
  1108. CreateViewModel();
  1109. fakePackage.Id = "MyPackage";
  1110. fakePackage.Title = "My Package Title";
  1111. string name = viewModel.Name;
  1112. Assert.AreEqual("My Package Title", name);
  1113. }
  1114. [Test]
  1115. public void GalleryUrl_PackageHasGalleryUrl_ReturnsUrl()
  1116. {
  1117. CreateViewModel();
  1118. var expectedUrl = new Uri("http://test.com/MyPackage");
  1119. fakePackage.GalleryUrl = expectedUrl;
  1120. Uri url = viewModel.GalleryUrl;
  1121. Assert.AreEqual(expectedUrl, url);
  1122. }
  1123. [Test]
  1124. public void HasGalleryUrl_PackageHasGalleryUrl_ReturnsTrue()
  1125. {
  1126. CreateViewModel();
  1127. var expectedUrl = new Uri("http://test.com/MyPackage");
  1128. fakePackage.GalleryUrl = expectedUrl;
  1129. bool result = viewModel.HasGalleryUrl;
  1130. Assert.IsTrue(result);
  1131. }
  1132. [Test]
  1133. public void HasNoGalleryUrl_PackageHasNoGalleryUrl_ReturnsFalse()
  1134. {
  1135. CreateViewModel();
  1136. fakePackage.GalleryUrl = null;
  1137. bool result = viewModel.HasGalleryUrl;
  1138. Assert.IsFalse(result);
  1139. }
  1140. [Test]
  1141. public void HasNoGalleryUrl_PackageHasGalleryUrl_ReturnsFalse()
  1142. {
  1143. CreateViewModel();
  1144. var expectedUrl = new Uri("http://test.com/MyPackage");
  1145. fakePackage.GalleryUrl = expectedUrl;
  1146. bool result = viewModel.HasNoGalleryUrl;
  1147. Assert.IsFalse(result);
  1148. }
  1149. [Test]
  1150. public void IsGalleryUrlMissing_PackageHasNoGalleryUrl_ReturnsTrue()
  1151. {
  1152. CreateViewModel();
  1153. fakePackage.GalleryUrl = null;
  1154. bool result = viewModel.HasNoGalleryUrl;
  1155. Assert.IsTrue(result);
  1156. }
  1157. [Test]
  1158. public void AddPackage_PackageRepositoryIsOperationAwareAndPackageAddedSuccessfully_InstallOperationStartedForPackage()
  1159. {
  1160. CreateViewModel();
  1161. var operationAwareRepository = new FakeOperationAwarePackageRepository();
  1162. fakePackage.FakePackageRepository = operationAwareRepository;
  1163. fakePackage.Id = "MyPackage";
  1164. viewModel.AddPackage();
  1165. operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Install, "MyPackage");
  1166. }
  1167. [Test]
  1168. public void AddPackage_PackageRepositoryIsOperationAwareAndExceptionThrownWhenCreatingInstallPackageAction_InstallOperationStartedForPackageBeforeInstallPackageActionCreatedAndPackageOperationsRequested()
  1169. {
  1170. CreateViewModelWithExceptionThrowingProject();
  1171. var operationAwareRepository = new FakeOperationAwarePackageRepository();
  1172. fakePackage.FakePackageRepository = operationAwareRepository;
  1173. fakePackage.Id = "MyPackage";
  1174. Exception ex = new Exception("Test");
  1175. exceptionThrowingProject.ExceptionToThrowWhenCreateInstallPackageActionCalled = ex;
  1176. viewModel.AddPackage();
  1177. operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Install, "MyPackage");
  1178. }
  1179. [Test]
  1180. public void ManagePackage_TwoProjectsAndFirstSelectedAndUserAcceptsSelectedProjectsAndSourceRepositoryIsOperationAware_InstallOperationStartedForPackage()
  1181. {
  1182. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  1183. UserAcceptsProjectSelection();
  1184. fakePackageManagementEvents.ProjectsToSelect.Add("Project A");
  1185. var operationAwareRepository = new FakeOperationAwarePackageRepository();
  1186. fakePackage.FakePackageRepository = operationAwareRepository;
  1187. fakePackage.Id = "MyPackage";
  1188. viewModel.ManagePackage();
  1189. operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Install, "MyPackage");
  1190. }
  1191. [Test]
  1192. public void ManagePackage_TwoProjectsNeitherSelectedAndSourceRepositoryIsOperationAware_InstallOperationStarted()
  1193. {
  1194. CreateViewModelWithTwoProjectsSelected("Project A", "Project B");
  1195. UserAcceptsProjectSelection();
  1196. var operationAwareRepository = new FakeOperationAwarePackageRepository();
  1197. fakePackage.FakePackageRepository = operationAwareRepository;
  1198. fakePackage.Id = "MyPackage";
  1199. viewModel.ManagePackage();
  1200. operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Install, "MyPackage");
  1201. }
  1202. }
  1203. }