Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 5571cb7

Browse files
committed
Allow user to enter repository URL in filter
If user enters a valid repository URL, expose it as the selected repository.
1 parent 2e2f2f5 commit 5571cb7

File tree

2 files changed

+70
-32
lines changed

2 files changed

+70
-32
lines changed

src/GitHub.App/ViewModels/Dialog/Clone/RepositorySelectViewModel.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Reactive.Linq;
88
using System.Threading.Tasks;
99
using System.Windows.Data;
10+
using GitHub.Exports;
1011
using GitHub.Extensions;
1112
using GitHub.Logging;
1213
using GitHub.Models;
@@ -23,6 +24,7 @@ public class RepositorySelectViewModel : ViewModelBase, IRepositorySelectViewMod
2324
{
2425
static readonly ILogger log = LogManager.ForContext<RepositorySelectViewModel>();
2526
readonly IRepositoryCloneService service;
27+
readonly IGitHubContextService gitHubContextService;
2628
IConnection connection;
2729
Exception error;
2830
string filter;
@@ -35,15 +37,26 @@ public class RepositorySelectViewModel : ViewModelBase, IRepositorySelectViewMod
3537
IRepositoryItemViewModel selectedItem;
3638

3739
[ImportingConstructor]
38-
public RepositorySelectViewModel(IRepositoryCloneService service)
40+
public RepositorySelectViewModel(IRepositoryCloneService service, IGitHubContextService gitHubContextService)
3941
{
4042
Guard.ArgumentNotNull(service, nameof(service));
43+
Guard.ArgumentNotNull(service, nameof(gitHubContextService));
4144

4245
this.service = service;
46+
this.gitHubContextService = gitHubContextService;
4347

44-
repository = this.WhenAnyValue(x => x.SelectedItem)
45-
.Select(CreateRepository)
48+
var selectedRepository = this.WhenAnyValue(x => x.SelectedItem)
49+
.Select(CreateRepository);
50+
51+
var filterRepository = this.WhenAnyValue(x => x.Filter)
52+
.Select(f => gitHubContextService.FindContextFromUrl(f))
53+
.Where(c => c?.LinkType == LinkType.Repository)
54+
.Select(c => new RepositoryModel(c.RepositoryName, c.Url));
55+
56+
repository = selectedRepository
57+
.Merge(filterRepository)
4658
.ToProperty(this, x => x.Repository);
59+
4760
this.WhenAnyValue(x => x.Filter).Subscribe(_ => ItemsView?.Refresh());
4861
}
4962

test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositorySelectViewModelTests.cs

Lines changed: 54 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public async Task Filter(string filter, string owner, string name, string url, i
3636
var hostAddress = HostAddress.GitHubDotComHostAddress;
3737
var connection = CreateConnection(hostAddress);
3838
var repositoryCloneService = CreateRepositoryCloneService(contributedToRepositories, hostAddress);
39-
var target = new RepositorySelectViewModel(repositoryCloneService);
39+
var gitHubContextService = CreateGitHubContextService();
40+
var target = new RepositorySelectViewModel(repositoryCloneService, gitHubContextService);
4041
target.Filter = filter;
4142
target.Initialize(connection);
4243

@@ -49,39 +50,63 @@ public async Task Filter(string filter, string owner, string name, string url, i
4950
Assert.That(items.Count, Is.EqualTo(expectCount));
5051
}
5152

52-
static IConnection CreateConnection(HostAddress hostAddress)
53+
[TestCase("filter", null)]
54+
[TestCase("https://github.com", null)]
55+
[TestCase("https://github.com/github/VisualStudio", "https://github.com/github/VisualStudio")]
56+
public void Set_Repository_When_Filter_Is_Url(string url, string expectUrl)
5357
{
54-
var connection = Substitute.For<IConnection>();
55-
connection.HostAddress.Returns(hostAddress);
56-
return connection;
57-
}
58+
var expectCloneUrl = expectUrl != null ? new UriString(expectUrl) : null;
59+
var repositoryCloneService = CreateRepositoryCloneService();
60+
var gitHubContextService = new GitHubContextService(Substitute.For<IGitHubServiceProvider>(),
61+
Substitute.For<IGitService>(), Substitute.For<IVSServices>());
62+
var target = new RepositorySelectViewModel(repositoryCloneService, gitHubContextService);
5863

59-
static IRepositoryCloneService CreateRepositoryCloneService(
60-
IList<RepositoryListItemModel> contributedToRepositories,
61-
HostAddress hostAddress)
62-
{
63-
var viewRepositoriesModel = CreateViewerRepositoriesModel(contributedToRepositories: contributedToRepositories);
64-
var repositoryCloneService = Substitute.For<IRepositoryCloneService>();
65-
repositoryCloneService.ReadViewerRepositories(hostAddress).Returns(viewRepositoriesModel);
66-
return repositoryCloneService;
64+
target.Filter = url;
65+
66+
Assert.That(target.Repository?.CloneUrl, Is.EqualTo(expectCloneUrl));
6767
}
68+
}
6869

69-
private static ViewerRepositoriesModel CreateViewerRepositoriesModel(
70-
string owner = "owner",
71-
IList<RepositoryListItemModel> repositories = null,
72-
IList<RepositoryListItemModel> contributedToRepositories = null)
73-
{
74-
repositories = repositories ?? Array.Empty<RepositoryListItemModel>();
75-
contributedToRepositories = contributedToRepositories ?? Array.Empty<RepositoryListItemModel>();
70+
static IGitHubContextService CreateGitHubContextService()
71+
{
72+
return Substitute.For<IGitHubContextService>();
73+
}
7674

77-
return new ViewerRepositoriesModel
78-
{
79-
Owner = owner,
80-
Repositories = CreateRepositoriesList(repositories),
81-
ContributedToRepositories = CreateRepositoriesList(contributedToRepositories),
82-
Organizations = CreateOrganizationsList()
83-
};
84-
}
75+
static IConnection CreateConnection(HostAddress hostAddress)
76+
{
77+
var connection = Substitute.For<IConnection>();
78+
connection.HostAddress.Returns(hostAddress);
79+
return connection;
80+
}
81+
82+
static IRepositoryCloneService CreateRepositoryCloneService(
83+
IList<RepositoryListItemModel> contributedToRepositories = null,
84+
HostAddress hostAddress = null)
85+
{
86+
contributedToRepositories = contributedToRepositories ?? Array.Empty<RepositoryListItemModel>();
87+
hostAddress = hostAddress ?? HostAddress.GitHubDotComHostAddress;
88+
89+
var viewRepositoriesModel = CreateViewerRepositoriesModel(contributedToRepositories: contributedToRepositories);
90+
var repositoryCloneService = Substitute.For<IRepositoryCloneService>();
91+
repositoryCloneService.ReadViewerRepositories(hostAddress).Returns(viewRepositoriesModel);
92+
return repositoryCloneService;
93+
}
94+
95+
private static ViewerRepositoriesModel CreateViewerRepositoriesModel(
96+
string owner = "owner",
97+
IList<RepositoryListItemModel> repositories = null,
98+
IList<RepositoryListItemModel> contributedToRepositories = null)
99+
{
100+
repositories = repositories ?? Array.Empty<RepositoryListItemModel>();
101+
contributedToRepositories = contributedToRepositories ?? Array.Empty<RepositoryListItemModel>();
102+
103+
return new ViewerRepositoriesModel
104+
{
105+
Owner = owner,
106+
Repositories = CreateRepositoriesList(repositories),
107+
ContributedToRepositories = CreateRepositoriesList(contributedToRepositories),
108+
Organizations = CreateOrganizationsList()
109+
};
85110
}
86111

87112
static IReadOnlyList<RepositoryListItemModel> CreateRepositoriesList(IList<RepositoryListItemModel> repositories)

0 commit comments

Comments
 (0)