1
- using System . Reactive . Linq ;
1
+ using System ;
2
+ using System . Linq . Expressions ;
3
+ using System . Reactive . Linq ;
2
4
using System . Threading . Tasks ;
5
+ using GitHub . Api ;
6
+ using GitHub . Models ;
7
+ using GitHub . Services ;
3
8
using NSubstitute ;
4
9
using NUnit . Framework ;
5
- using UnitTests ;
6
- using GitHub . Services ;
7
- using System . Linq . Expressions ;
8
- using System ;
9
- using GitHub . Models ;
10
+ using Rothko ;
10
11
11
12
public class RepositoryCloneServiceTests
12
13
{
13
- public class TheCloneRepositoryMethod : TestBaseClass
14
+ public class TheCloneRepositoryMethod
14
15
{
15
16
[ Test ]
16
17
public async Task ClonesToRepositoryPathAsync ( )
17
18
{
18
- var serviceProvider = Substitutes . GetServiceProvider ( ) ;
19
- var operatingSystem = serviceProvider . GetOperatingSystem ( ) ;
20
- var vsGitServices = serviceProvider . GetVSGitServices ( ) ;
21
- var cloneService = CreateRepositoryCloneService ( serviceProvider ) ;
19
+ var operatingSystem = Substitute . For < IOperatingSystem > ( ) ;
20
+ var vsGitServices = Substitute . For < IVSGitServices > ( ) ;
21
+ var cloneService = CreateRepositoryCloneService ( operatingSystem , vsGitServices ) ;
22
22
23
23
await cloneService . CloneRepository ( "https://github.com/foo/bar" , @"c:\dev\bar" ) ;
24
24
@@ -34,9 +34,9 @@ public async Task ClonesToRepositoryPathAsync()
34
34
[ TestCase ( "https://enterprise.com/foo/bar" , 0 , nameof ( UsageModel . MeasuresModel . NumberOfGitHubClones ) ) ]
35
35
public async Task UpdatesMetricsWhenRepositoryClonedAsync ( string cloneUrl , int numberOfCalls , string counterName )
36
36
{
37
- var serviceProvider = Substitutes . GetServiceProvider ( ) ;
38
- var usageTracker = serviceProvider . GetUsageTracker ( ) ;
39
- var cloneService = CreateRepositoryCloneService ( serviceProvider ) ;
37
+ var vsGitServices = Substitute . For < IVSGitServices > ( ) ;
38
+ var usageTracker = Substitute . For < IUsageTracker > ( ) ;
39
+ var cloneService = CreateRepositoryCloneService ( vsGitServices : vsGitServices , usageTracker : usageTracker ) ;
40
40
41
41
await cloneService . CloneRepository ( cloneUrl , @"c:\dev\bar" ) ;
42
42
var model = UsageModel . Create ( Guid . NewGuid ( ) ) ;
@@ -58,8 +58,9 @@ public async Task Skip_OpenRepository_When_Already_Open(string repositoryPath, s
58
58
{
59
59
var repositoryUrl = "https://github.com/owner/repo" ;
60
60
var cloneDialogResult = new CloneDialogResult ( repositoryPath , repositoryUrl ) ;
61
- var serviceProvider = Substitutes . GetServiceProvider ( ) ;
62
- var operatingSystem = serviceProvider . GetOperatingSystem ( ) ;
61
+ var operatingSystem = Substitute . For < IOperatingSystem > ( ) ;
62
+ var serviceProvider = Substitute . For < IGitHubServiceProvider > ( ) ;
63
+ var teamExplorerServices = Substitute . For < ITeamExplorerServices > ( ) ;
63
64
operatingSystem . Directory . DirectoryExists ( repositoryPath ) . Returns ( true ) ;
64
65
var dte = Substitute . For < EnvDTE . DTE > ( ) ;
65
66
serviceProvider . GetService < EnvDTE . DTE > ( ) . Returns ( dte ) ;
@@ -68,11 +69,11 @@ public async Task Skip_OpenRepository_When_Already_Open(string repositoryPath, s
68
69
{
69
70
operatingSystem . Directory . DirectoryExists ( solutionPath ) . Returns ( true ) ;
70
71
}
71
- var cloneService = CreateRepositoryCloneService ( serviceProvider ) ;
72
+ var cloneService = CreateRepositoryCloneService ( operatingSystem : operatingSystem ,
73
+ teamExplorerServices : teamExplorerServices , serviceProvider : serviceProvider ) ;
72
74
73
75
await cloneService . CloneOrOpenRepository ( cloneDialogResult ) ;
74
76
75
- var teamExplorerServices = serviceProvider . GetTeamExplorerServices ( ) ;
76
77
teamExplorerServices . Received ( openRepository ) . OpenRepository ( repositoryPath ) ;
77
78
}
78
79
@@ -91,11 +92,10 @@ public async Task UpdatesMetricsWhenCloneOrOpenRepositoryAsync(string cloneUrl,
91
92
{
92
93
var repositoryPath = @"c:\dev\bar" ;
93
94
var cloneDialogResult = new CloneDialogResult ( repositoryPath , cloneUrl ) ;
94
- var serviceProvider = Substitutes . GetServiceProvider ( ) ;
95
- var operatingSystem = serviceProvider . GetOperatingSystem ( ) ;
95
+ var operatingSystem = Substitute . For < IOperatingSystem > ( ) ;
96
+ var usageTracker = Substitute . For < IUsageTracker > ( ) ;
96
97
operatingSystem . Directory . DirectoryExists ( repositoryPath ) . Returns ( dirExists ) ;
97
- var usageTracker = serviceProvider . GetUsageTracker ( ) ;
98
- var cloneService = CreateRepositoryCloneService ( serviceProvider ) ;
98
+ var cloneService = CreateRepositoryCloneService ( operatingSystem : operatingSystem , usageTracker : usageTracker ) ;
99
99
100
100
await cloneService . CloneOrOpenRepository ( cloneDialogResult ) ;
101
101
@@ -108,11 +108,10 @@ await usageTracker.Received(numberOfCalls).IncrementCounter(
108
108
[ TestCase ( @"c:\not_default\repo" , @"c:\default" , 0 , nameof ( UsageModel . MeasuresModel . NumberOfClonesToDefaultClonePath ) ) ]
109
109
public async Task UpdatesMetricsWhenDefaultClonePath ( string targetPath , string defaultPath , int numberOfCalls , string counterName )
110
110
{
111
- var serviceProvider = Substitutes . GetServiceProvider ( ) ;
112
- var vsGitServices = serviceProvider . GetVSGitServices ( ) ;
111
+ var vsGitServices = Substitute . For < IVSGitServices > ( ) ;
113
112
vsGitServices . GetLocalClonePathFromGitProvider ( ) . Returns ( defaultPath ) ;
114
- var usageTracker = serviceProvider . GetUsageTracker ( ) ;
115
- var cloneService = CreateRepositoryCloneService ( serviceProvider ) ;
113
+ var usageTracker = Substitute . For < IUsageTracker > ( ) ;
114
+ var cloneService = CreateRepositoryCloneService ( usageTracker : usageTracker , vsGitServices : vsGitServices ) ;
116
115
117
116
await cloneService . CloneRepository ( "https://github.com/foo/bar" , targetPath ) ;
118
117
var model = UsageModel . Create ( Guid . NewGuid ( ) ) ;
@@ -122,10 +121,36 @@ await usageTracker.Received(numberOfCalls).IncrementCounter(
122
121
( ( MemberExpression ) x . Body ) . Member . Name == counterName ) ) ;
123
122
}
124
123
125
- static RepositoryCloneService CreateRepositoryCloneService ( IGitHubServiceProvider sp )
124
+ [ TestCase ( "https://github.com/failing/url" , @"c:\dev\bar" ) ]
125
+ public async Task CleansDirectoryOnCloneFailed ( string cloneUrl , string clonePath )
126
126
{
127
- return new RepositoryCloneService ( sp . GetOperatingSystem ( ) , sp . GetVSGitServices ( ) , sp . GetTeamExplorerServices ( ) ,
128
- sp . GetGraphQLClientFactory ( ) , sp . GetGitHubContextService ( ) , sp . GetUsageTracker ( ) , sp ) ;
127
+ var operatingSystem = Substitute . For < IOperatingSystem > ( ) ;
128
+ var vsGitServices = Substitute . For < IVSGitServices > ( ) ;
129
+ vsGitServices . Clone ( cloneUrl , clonePath , true ) . Returns ( x => { throw new Exception ( ) ; } ) ;
130
+ var cloneService = CreateRepositoryCloneService ( operatingSystem : operatingSystem , vsGitServices : vsGitServices ) ;
131
+
132
+ Assert . ThrowsAsync < Exception > ( ( ) => cloneService . CloneRepository ( cloneUrl , clonePath ) ) ;
133
+
134
+ operatingSystem . Directory . Received ( ) . CreateDirectory ( clonePath ) ;
135
+ operatingSystem . Directory . Received ( ) . DeleteDirectory ( clonePath ) ;
136
+ await vsGitServices . Received ( ) . Clone ( cloneUrl , clonePath , true ) ;
137
+ }
138
+
139
+ static RepositoryCloneService CreateRepositoryCloneService ( IOperatingSystem operatingSystem = null ,
140
+ IVSGitServices vsGitServices = null , IUsageTracker usageTracker = null ,
141
+ ITeamExplorerServices teamExplorerServices = null , IGitHubServiceProvider serviceProvider = null )
142
+ {
143
+ operatingSystem = operatingSystem ?? Substitute . For < IOperatingSystem > ( ) ;
144
+ vsGitServices = vsGitServices ?? Substitute . For < IVSGitServices > ( ) ;
145
+ usageTracker = usageTracker ?? Substitute . For < IUsageTracker > ( ) ;
146
+ teamExplorerServices = teamExplorerServices ?? Substitute . For < ITeamExplorerServices > ( ) ;
147
+ serviceProvider = serviceProvider ?? Substitute . For < IGitHubServiceProvider > ( ) ;
148
+
149
+ operatingSystem . Environment . ExpandEnvironmentVariables ( Args . String ) . Returns ( x => x [ 0 ] ) ;
150
+
151
+ return new RepositoryCloneService ( operatingSystem , vsGitServices , teamExplorerServices ,
152
+ Substitute . For < IGraphQLClientFactory > ( ) , Substitute . For < IGitHubContextService > ( ) ,
153
+ usageTracker , serviceProvider ) ;
129
154
}
130
155
}
131
156
}
0 commit comments