PageRenderTime 49ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/UnitTests/GitHub.App/ViewModels/RepositoryCreationViewModelTests.cs

https://gitlab.com/github-cloud-corporation/VisualStudio
C# | 639 lines | 536 code | 100 blank | 3 comment | 30 complexity | 5479a4db2bb2248f683b0d4f35bd74ee MD5 | raw file
  1. using System;
  2. using System.Linq;
  3. using System.Reactive;
  4. using System.Reactive.Linq;
  5. using System.Threading.Tasks;
  6. using GitHub.Extensions.Reactive;
  7. using GitHub.Models;
  8. using GitHub.Services;
  9. using GitHub.ViewModels;
  10. using NSubstitute;
  11. using Octokit;
  12. using Rothko;
  13. using UnitTests;
  14. using Xunit;
  15. using GitHub.Extensions;
  16. using GitHub.SampleData;
  17. using System.Collections.Generic;
  18. using System.Collections.ObjectModel;
  19. using System.Reactive.Subjects;
  20. public class RepositoryCreationViewModelTests
  21. {
  22. static object DefaultInstance = new object();
  23. static IRepositoryCreationViewModel GetMeAViewModel(
  24. IServiceProvider provider = null,
  25. IRepositoryCreationService creationService = null)
  26. {
  27. if (provider == null)
  28. provider = Substitutes.ServiceProvider;
  29. var repositoryHost = provider.GetRepositoryHosts().GitHubHost;
  30. var os = provider.GetOperatingSystem();
  31. creationService = creationService ?? provider.GetRepositoryCreationService();
  32. var avatarProvider = provider.GetAvatarProvider();
  33. var connection = provider.GetConnection();
  34. var usageTracker = Substitute.For<IUsageTracker>();
  35. return new RepositoryCreationViewModel(repositoryHost, os, creationService, usageTracker);
  36. }
  37. public class TheSafeRepositoryNameProperty : TestBaseClass
  38. {
  39. [Fact]
  40. public void IsTheSameAsTheRepositoryNameWhenTheInputIsSafe()
  41. {
  42. var vm = GetMeAViewModel();
  43. vm.BaseRepositoryPath = @"c:\fake\";
  44. vm.RepositoryName = "this-is-bad";
  45. Assert.Equal(vm.RepositoryName, vm.SafeRepositoryName);
  46. }
  47. [Fact]
  48. public void IsConvertedWhenTheRepositoryNameIsNotSafe()
  49. {
  50. var vm = GetMeAViewModel();
  51. vm.RepositoryName = "this is bad";
  52. Assert.Equal("this-is-bad", vm.SafeRepositoryName);
  53. }
  54. [Fact]
  55. public void IsNullWhenRepositoryNameIsNull()
  56. {
  57. var vm = GetMeAViewModel();
  58. Assert.Null(vm.SafeRepositoryName);
  59. vm.RepositoryName = "not-null";
  60. vm.RepositoryName = null;
  61. Assert.Null(vm.SafeRepositoryName);
  62. }
  63. }
  64. public class TheBrowseForDirectoryCommand : TestBaseClass
  65. {
  66. [Fact]
  67. public async Task SetsTheBaseRepositoryPathWhenUserChoosesADirectory()
  68. {
  69. var provider = Substitutes.ServiceProvider;
  70. var windows = provider.GetOperatingSystem();
  71. windows.Dialog.BrowseForDirectory(@"c:\fake\dev", Args.String)
  72. .Returns(new BrowseDirectoryResult(@"c:\fake\foo"));
  73. var vm = GetMeAViewModel(provider);
  74. vm.BaseRepositoryPath = @"c:\fake\dev";
  75. await vm.BrowseForDirectory.ExecuteAsync();
  76. Assert.Equal(@"c:\fake\foo", vm.BaseRepositoryPath);
  77. }
  78. [Fact]
  79. public async Task DoesNotChangeTheBaseRepositoryPathWhenUserDoesNotChooseResult()
  80. {
  81. var provider = Substitutes.ServiceProvider;
  82. var windows = provider.GetOperatingSystem();
  83. windows.Dialog.BrowseForDirectory(@"c:\fake\dev", Args.String)
  84. .Returns(BrowseDirectoryResult.Failed);
  85. var vm = GetMeAViewModel(provider);
  86. vm.BaseRepositoryPath = @"c:\fake\dev";
  87. await vm.BrowseForDirectory.ExecuteAsync();
  88. Assert.Equal(@"c:\fake\dev", vm.BaseRepositoryPath);
  89. }
  90. }
  91. public class TheBaseRepositoryPathProperty : TestBaseClass
  92. {
  93. [Fact]
  94. public void IsSetFromTheRepositoryCreationService()
  95. {
  96. var repositoryCreationService = Substitute.For<IRepositoryCreationService>();
  97. repositoryCreationService.DefaultClonePath.Returns(@"c:\fake\default");
  98. var vm = GetMeAViewModel(creationService: repositoryCreationService);
  99. Assert.Equal(@"c:\fake\default", vm.BaseRepositoryPath);
  100. }
  101. }
  102. public class TheBaseRepositoryPathValidatorProperty : TestBaseClass
  103. {
  104. [Fact]
  105. public void IsFalseWhenPathEmpty()
  106. {
  107. var vm = GetMeAViewModel();
  108. vm.BaseRepositoryPath = "";
  109. vm.RepositoryName = "foo";
  110. Assert.False(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  111. Assert.Equal("Please enter a repository path", vm.BaseRepositoryPathValidator.ValidationResult.Message);
  112. }
  113. [Fact]
  114. public void IsFalseWhenPathHasInvalidCharacters()
  115. {
  116. var vm = GetMeAViewModel();
  117. vm.BaseRepositoryPath = @"c:\fake!!>\";
  118. vm.RepositoryName = "foo";
  119. Assert.False(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  120. Assert.Equal("Path contains invalid characters",
  121. vm.BaseRepositoryPathValidator.ValidationResult.Message);
  122. }
  123. [Fact]
  124. public void IsFalseWhenLotsofInvalidCharactersInPath()
  125. {
  126. var vm = GetMeAViewModel();
  127. vm.BaseRepositoryPath = @"c:\fake???\sajoisfaoia\afsofsafs::::\";
  128. vm.RepositoryName = "foo";
  129. Assert.False(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  130. Assert.Equal("Path contains invalid characters",
  131. vm.BaseRepositoryPathValidator.ValidationResult.Message);
  132. }
  133. [Fact]
  134. public void IsValidWhenUserAccidentallyUsesForwardSlashes()
  135. {
  136. var vm = GetMeAViewModel();
  137. vm.BaseRepositoryPath = @"c:\fake\sajoisfaoia/afsofsafs/";
  138. vm.RepositoryName = "foo";
  139. Assert.True(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  140. }
  141. [Fact]
  142. public void IsFalseWhenPathIsNotRooted()
  143. {
  144. var vm = GetMeAViewModel();
  145. vm.BaseRepositoryPath = "fake";
  146. vm.RepositoryName = "foo";
  147. Assert.False(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  148. Assert.Equal("Please enter a valid path", vm.BaseRepositoryPathValidator.ValidationResult.Message);
  149. }
  150. [Fact]
  151. public void IsFalseWhenAfterBeingTrue()
  152. {
  153. var vm = GetMeAViewModel();
  154. vm.BaseRepositoryPath = @"c:\fake\";
  155. vm.RepositoryName = "repo";
  156. Assert.True(vm.RepositoryNameValidator.ValidationResult.IsValid);
  157. Assert.Empty(vm.RepositoryNameValidator.ValidationResult.Message);
  158. vm.BaseRepositoryPath = "";
  159. Assert.False(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  160. Assert.Equal("Please enter a repository path", vm.BaseRepositoryPathValidator.ValidationResult.Message);
  161. }
  162. [Fact]
  163. public void IsTrueWhenRepositoryNameAndPathIsValid()
  164. {
  165. var vm = GetMeAViewModel();
  166. vm.BaseRepositoryPath = @"c:\fake\";
  167. vm.RepositoryName = "thisisfine";
  168. Assert.True(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  169. Assert.Empty(vm.BaseRepositoryPathValidator.ValidationResult.Message);
  170. }
  171. [Fact]
  172. public void IsTrueWhenSetToValidQuotedPath()
  173. {
  174. var vm = GetMeAViewModel();
  175. vm.RepositoryName = "thisisfine";
  176. vm.BaseRepositoryPath = @"""c:\fake""";
  177. Assert.True(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  178. Assert.Equal(@"c:\fake", vm.BaseRepositoryPath);
  179. }
  180. [Fact]
  181. public void ReturnsCorrectMessageWhenPathTooLong()
  182. {
  183. var vm = GetMeAViewModel();
  184. vm.BaseRepositoryPath = @"C:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";
  185. Assert.False(vm.BaseRepositoryPathValidator.ValidationResult.IsValid);
  186. Assert.Equal("Path too long", vm.BaseRepositoryPathValidator.ValidationResult.Message);
  187. }
  188. }
  189. public class TheRepositoryNameValidatorProperty : TestBaseClass
  190. {
  191. [Fact]
  192. public void IsFalseWhenRepoNameEmpty()
  193. {
  194. var vm = GetMeAViewModel();
  195. vm.BaseRepositoryPath = @"c:\fake\";
  196. vm.RepositoryName = "";
  197. Assert.False(vm.RepositoryNameValidator.ValidationResult.IsValid);
  198. Assert.Equal("Please enter a repository name", vm.RepositoryNameValidator.ValidationResult.Message);
  199. }
  200. [Fact]
  201. public void IsFalseWhenAfterBeingTrue()
  202. {
  203. var vm = GetMeAViewModel();
  204. vm.BaseRepositoryPath = @"c:\fake\";
  205. vm.RepositoryName = "repo";
  206. Assert.True(vm.CreateRepository.CanExecute(null));
  207. Assert.True(vm.RepositoryNameValidator.ValidationResult.IsValid);
  208. Assert.Empty(vm.RepositoryNameValidator.ValidationResult.Message);
  209. vm.RepositoryName = "";
  210. Assert.False(vm.RepositoryNameValidator.ValidationResult.IsValid);
  211. Assert.Equal("Please enter a repository name", vm.RepositoryNameValidator.ValidationResult.Message);
  212. }
  213. [Fact]
  214. public void IsTrueWhenRepositoryNameAndPathIsValid()
  215. {
  216. var vm = GetMeAViewModel();
  217. vm.RepositoryName = "thisisfine";
  218. Assert.True(vm.RepositoryNameValidator.ValidationResult.IsValid);
  219. Assert.Empty(vm.RepositoryNameValidator.ValidationResult.Message);
  220. }
  221. [Theory]
  222. [InlineData(true, false)]
  223. [InlineData(false, true)]
  224. public void IsFalseWhenRepositoryAlreadyExists(bool exists, bool expected)
  225. {
  226. var provider = Substitutes.ServiceProvider;
  227. var operatingSystem = provider.GetOperatingSystem();
  228. operatingSystem.Directory.Exists(@"c:\fake\foo").Returns(exists);
  229. var vm = GetMeAViewModel(provider);
  230. vm.BaseRepositoryPath = @"c:\fake\";
  231. vm.RepositoryName = "foo";
  232. Assert.Equal(expected, vm.RepositoryNameValidator.ValidationResult.IsValid);
  233. if (!expected)
  234. Assert.Equal("Repository with same name already exists at this location",
  235. vm.RepositoryNameValidator.ValidationResult.Message);
  236. }
  237. }
  238. public class TheSafeRepositoryNameWarningValidatorProperty : TestBaseClass
  239. {
  240. [Fact]
  241. public void IsTrueWhenRepoNameIsSafe()
  242. {
  243. var vm = GetMeAViewModel();
  244. vm.BaseRepositoryPath = @"c:\fake\";
  245. vm.RepositoryName = "this-is-bad";
  246. Assert.True(vm.SafeRepositoryNameWarningValidator.ValidationResult.IsValid);
  247. }
  248. [Fact]
  249. public void IsFalseWhenRepoNameIsNotSafe()
  250. {
  251. var vm = GetMeAViewModel();
  252. vm.BaseRepositoryPath = @"c:\fake\";
  253. vm.RepositoryName = "this is bad";
  254. Assert.False(vm.SafeRepositoryNameWarningValidator.ValidationResult.IsValid);
  255. Assert.Equal("Will be created as this-is-bad", vm.SafeRepositoryNameWarningValidator.ValidationResult.Message);
  256. }
  257. }
  258. public class TheAccountsProperty : TestBaseClass
  259. {
  260. [Fact]
  261. public void IsPopulatedByTheRepositoryHost()
  262. {
  263. var accounts = new List<IAccount> { new AccountDesigner(), new AccountDesigner() };
  264. var repositoryHost = Substitute.For<IRepositoryHost>();
  265. repositoryHost.ModelService.GetAccounts().Returns(Observable.Return(accounts));
  266. var vm = new RepositoryCreationViewModel(
  267. repositoryHost,
  268. Substitute.For<IOperatingSystem>(),
  269. Substitute.For<IRepositoryCreationService>(),
  270. Substitute.For<IUsageTracker>());
  271. Assert.Equal(vm.Accounts[0], vm.SelectedAccount);
  272. Assert.Equal(2, vm.Accounts.Count);
  273. }
  274. }
  275. public class TheGitIgnoreTemplatesProperty : TestBaseClass
  276. {
  277. [Fact]
  278. public async void IsPopulatedByTheApiAndSortedWithRecommendedFirst()
  279. {
  280. var gitIgnoreTemplates = new[]
  281. {
  282. "VisualStudio",
  283. "Node",
  284. "Waf",
  285. "WordPress"
  286. }.Select(GitIgnoreItem.Create);
  287. var provider = Substitutes.ServiceProvider;
  288. var hosts = provider.GetRepositoryHosts();
  289. var host = hosts.GitHubHost;
  290. hosts.LookupHost(Args.HostAddress).Returns(host);
  291. host.ModelService
  292. .GetGitIgnoreTemplates()
  293. .Returns(gitIgnoreTemplates.ToObservable());
  294. var vm = GetMeAViewModel(provider);
  295. // this is how long the default collection waits to process about 5 things with the default UI settings
  296. await Task.Delay(100);
  297. var result = vm.GitIgnoreTemplates;
  298. Assert.Equal(5, result.Count);
  299. Assert.Equal("None", result[0].Name);
  300. Assert.True(result[0].Recommended);
  301. Assert.Equal("VisualStudio", result[1].Name);
  302. Assert.True(result[1].Recommended);
  303. Assert.Equal("Node", result[2].Name);
  304. Assert.True(result[2].Recommended);
  305. Assert.Equal("Waf", result[3].Name);
  306. Assert.False(result[3].Recommended);
  307. Assert.Equal("WordPress", result[4].Name);
  308. Assert.False(result[4].Recommended);
  309. }
  310. }
  311. public class TheLicensesProperty : TestBaseClass
  312. {
  313. [Fact]
  314. public async void IsPopulatedByTheModelService()
  315. {
  316. var licenses = new[]
  317. {
  318. new LicenseItem("apache-2.0", "Apache License 2.0"),
  319. new LicenseItem("mit", "MIT License"),
  320. new LicenseItem("agpl-3.0", "GNU Affero GPL v3.0"),
  321. new LicenseItem("artistic-2.0", "Artistic License 2.0")
  322. };
  323. var provider = Substitutes.ServiceProvider;
  324. var hosts = provider.GetRepositoryHosts();
  325. var host = hosts.GitHubHost;
  326. hosts.LookupHost(Args.HostAddress).Returns(host);
  327. host.ModelService
  328. .GetLicenses()
  329. .Returns(licenses.ToObservable());
  330. var vm = GetMeAViewModel(provider);
  331. // this is how long the default collection waits to process about 5 things with the default UI settings
  332. await Task.Delay(100);
  333. var result = vm.Licenses;
  334. Assert.Equal(5, result.Count);
  335. Assert.Equal("", result[0].Key);
  336. Assert.Equal("None", result[0].Name);
  337. Assert.True(result[0].Recommended);
  338. Assert.Equal("apache-2.0", result[1].Key);
  339. Assert.True(result[1].Recommended);
  340. Assert.Equal("mit", result[2].Key);
  341. Assert.True(result[2].Recommended);
  342. Assert.Equal("agpl-3.0", result[3].Key);
  343. Assert.False(result[3].Recommended);
  344. Assert.Equal("artistic-2.0", result[4].Key);
  345. Assert.False(result[4].Recommended);
  346. Assert.Equal(result[0], vm.SelectedLicense);
  347. }
  348. }
  349. public class TheSelectedGitIgnoreProperty : TestBaseClass
  350. {
  351. [Fact]
  352. public async void DefaultsToVisualStudio()
  353. {
  354. var gitignores = new[]
  355. {
  356. GitIgnoreItem.Create("C++"),
  357. GitIgnoreItem.Create("Node"),
  358. GitIgnoreItem.Create("VisualStudio"),
  359. };
  360. var provider = Substitutes.ServiceProvider;
  361. var hosts = provider.GetRepositoryHosts();
  362. var host = hosts.GitHubHost;
  363. hosts.LookupHost(Args.HostAddress).Returns(host);
  364. host.ModelService
  365. .GetGitIgnoreTemplates()
  366. .Returns(gitignores.ToObservable());
  367. var vm = GetMeAViewModel(provider);
  368. // this is how long the default collection waits to process about 5 things with the default UI settings
  369. await Task.Delay(100);
  370. Assert.Equal("VisualStudio", vm.SelectedGitIgnoreTemplate.Name);
  371. }
  372. [Fact]
  373. public void DefaultsToNoneIfVisualStudioIsMissingSomehow()
  374. {
  375. var gitignores = new[]
  376. {
  377. GitIgnoreItem.None,
  378. GitIgnoreItem.Create("C++"),
  379. GitIgnoreItem.Create("Node"),
  380. };
  381. var provider = Substitutes.ServiceProvider;
  382. var hosts = provider.GetRepositoryHosts();
  383. var host = hosts.GitHubHost;
  384. hosts.LookupHost(Args.HostAddress).Returns(host);
  385. host.ModelService
  386. .GetGitIgnoreTemplates()
  387. .Returns(gitignores.ToObservable());
  388. var vm = GetMeAViewModel(provider);
  389. Assert.Equal("None", vm.SelectedGitIgnoreTemplate.Name);
  390. }
  391. }
  392. public class TheCreateRepositoryCommand : TestBaseClass
  393. {
  394. [Fact]
  395. public async Task DisplaysUserErrorWhenCreationFails()
  396. {
  397. var creationService = Substitutes.RepositoryCreationService;
  398. var provider = Substitutes.GetServiceProvider(creationService: creationService);
  399. creationService.CreateRepository(Args.NewRepository, Args.Account, Args.String, Args.ApiClient)
  400. .Returns(Observable.Throw<Unit>(new InvalidOperationException("Could not create a repository on GitHub")));
  401. var vm = GetMeAViewModel(provider);
  402. vm.RepositoryName = "my-repo";
  403. using (var handlers = ReactiveTestHelper.OverrideHandlersForTesting())
  404. {
  405. await vm.CreateRepository.ExecuteAsync().Catch(Observable.Return(Unit.Default));
  406. Assert.Equal("Could not create a repository on GitHub", handlers.LastError.ErrorMessage);
  407. }
  408. }
  409. [Fact]
  410. public void CreatesARepositoryUsingTheCreationService()
  411. {
  412. var creationService = Substitutes.RepositoryCreationService;
  413. var provider = Substitutes.GetServiceProvider(creationService: creationService);
  414. var account = Substitute.For<IAccount>();
  415. var hosts = provider.GetRepositoryHosts();
  416. var host = hosts.GitHubHost;
  417. hosts.LookupHost(Args.HostAddress).Returns(host);
  418. host.ModelService.GetAccounts().Returns(Observable.Return(new List<IAccount> { account }));
  419. var vm = GetMeAViewModel(provider);
  420. vm.RepositoryName = "Krieger";
  421. vm.BaseRepositoryPath = @"c:\dev";
  422. vm.SelectedAccount = account;
  423. vm.KeepPrivate = true;
  424. vm.CreateRepository.Execute(null);
  425. creationService
  426. .Received()
  427. .CreateRepository(
  428. Arg.Is<NewRepository>(r => r.Name == "Krieger"
  429. && r.Private == true
  430. && r.AutoInit == null
  431. && r.LicenseTemplate == null
  432. && r.GitignoreTemplate == null),
  433. account,
  434. @"c:\dev",
  435. Args.ApiClient);
  436. }
  437. [Fact]
  438. public void SetsAutoInitToTrueWhenLicenseSelected()
  439. {
  440. var creationService = Substitutes.RepositoryCreationService;
  441. var provider = Substitutes.GetServiceProvider(creationService: creationService);
  442. var account = Substitute.For<IAccount>();
  443. var hosts = provider.GetRepositoryHosts();
  444. var host = hosts.GitHubHost;
  445. hosts.LookupHost(Args.HostAddress).Returns(host);
  446. host.ModelService.GetAccounts().Returns(Observable.Return(new List<IAccount> { account }));
  447. var vm = GetMeAViewModel(provider);
  448. vm.RepositoryName = "Krieger";
  449. vm.BaseRepositoryPath = @"c:\dev";
  450. vm.SelectedAccount = account;
  451. vm.KeepPrivate = false;
  452. vm.SelectedLicense = new LicenseItem("mit", "MIT");
  453. vm.CreateRepository.Execute(null);
  454. creationService
  455. .Received()
  456. .CreateRepository(
  457. Arg.Is<NewRepository>(r => r.Name == "Krieger"
  458. && r.Private == false
  459. && r.AutoInit == true
  460. && r.LicenseTemplate == "mit"
  461. && r.GitignoreTemplate == null),
  462. account,
  463. @"c:\dev",
  464. Args.ApiClient);
  465. }
  466. [Fact]
  467. public void SetsAutoInitToTrueWhenGitIgnore()
  468. {
  469. var creationService = Substitutes.RepositoryCreationService;
  470. var provider = Substitutes.GetServiceProvider(creationService: creationService);
  471. var account = Substitute.For<IAccount>();
  472. var hosts = provider.GetRepositoryHosts();
  473. var host = hosts.GitHubHost;
  474. hosts.LookupHost(Args.HostAddress).Returns(host);
  475. host.ModelService.GetAccounts().Returns(Observable.Return(new List<IAccount> { account }));
  476. var vm = GetMeAViewModel(provider);
  477. vm.RepositoryName = "Krieger";
  478. vm.BaseRepositoryPath = @"c:\dev";
  479. vm.SelectedAccount = account;
  480. vm.KeepPrivate = false;
  481. vm.SelectedGitIgnoreTemplate = GitIgnoreItem.Create("VisualStudio");
  482. vm.CreateRepository.Execute(null);
  483. creationService
  484. .Received()
  485. .CreateRepository(
  486. Arg.Is<NewRepository>(r => r.Name == "Krieger"
  487. && r.Private == false
  488. && r.AutoInit == true
  489. && r.LicenseTemplate == null
  490. && r.GitignoreTemplate == "VisualStudio"),
  491. account,
  492. @"c:\dev",
  493. Args.ApiClient);
  494. }
  495. [Theory]
  496. [InlineData("", "", false)]
  497. [InlineData("", @"c:\dev", false)]
  498. [InlineData("blah", @"c:\|dev", false)]
  499. [InlineData("blah", @"c:\dev", true)]
  500. public void CannotCreateWhenRepositoryNameOrBasePathIsInvalid(
  501. string repositoryName,
  502. string baseRepositoryPath,
  503. bool expected)
  504. {
  505. var vm = GetMeAViewModel();
  506. vm.RepositoryName = repositoryName;
  507. vm.BaseRepositoryPath = baseRepositoryPath;
  508. var reactiveCommand = vm.CreateRepository as ReactiveUI.ReactiveCommand<Unit>;
  509. bool result = reactiveCommand.CanExecute(null);
  510. Assert.Equal(expected, result);
  511. }
  512. }
  513. public class TheCanKeepPrivateProperty : TestBaseClass
  514. {
  515. [Theory]
  516. [InlineData(true, false, false, false)]
  517. [InlineData(true, false, true, false)]
  518. [InlineData(false, false, true, false)]
  519. [InlineData(true, true, true, true)]
  520. [InlineData(false, false, false, true)]
  521. public void IsOnlyTrueWhenUserIsEntepriseOrNotOnFreeAccountThatIsNotMaxedOut(
  522. bool isFreeAccount,
  523. bool isEnterprise,
  524. bool isMaxedOut,
  525. bool expected)
  526. {
  527. var selectedAccount = Substitute.For<IAccount>();
  528. selectedAccount.IsOnFreePlan.Returns(isFreeAccount);
  529. selectedAccount.IsEnterprise.Returns(isEnterprise);
  530. selectedAccount.HasMaximumPrivateRepositories.Returns(isMaxedOut);
  531. var vm = GetMeAViewModel();
  532. vm.SelectedAccount = selectedAccount;
  533. Assert.Equal(expected, vm.CanKeepPrivate);
  534. }
  535. }
  536. }