@@ -44,7 +44,6 @@ public void Evaluate_ThrowsForNullArgument()
4444 Assert . ThrowsAsync < ArgumentNullException > ( ( ) => policyHandler . EvaluateAsync ( null ) ) ;
4545 }
4646
47-
4847 [ Fact ]
4948 public async Task Evaluate_DoesNotCommitChangesToEntityContext ( )
5049 {
@@ -71,13 +70,13 @@ public async Task Evaluate_DoesNotCommitChangesToEntityContext()
7170 var telemetryService = new Mock < ITelemetryService > ( ) . Object ;
7271
7372 var context = new PackageSecurityPolicyEvaluationContext (
74- userService . Object ,
75- packageOwnershipManagementService . Object ,
73+ userService . Object ,
74+ packageOwnershipManagementService . Object ,
7675 telemetryService ,
77- subscription . Policies ,
76+ subscription . Policies ,
7877 newMicrosoftCompliantPackage ,
7978 sourceAccount : nugetUser ,
80- targetAccount : nugetUser ,
79+ targetAccount : nugetUser ,
8180 httpContext : It . IsAny < HttpContextBase > ( ) ) ;
8281
8382 // Act
@@ -97,9 +96,9 @@ public async Task Evaluate_SilentlySucceedsWhenRequiredCoOwnerDoesNotExist()
9796 var policyHandler = new RequirePackageMetadataCompliancePolicy ( ) ;
9897 var fakes = new Fakes ( ) ;
9998 var context = CreateTestContext (
100- false ,
101- subscription . Policies ,
102- fakes . NewPackageVersion ,
99+ false ,
100+ subscription . Policies ,
101+ fakes . NewPackageVersion ,
103102 packageRegistrationAlreadyExists : false ,
104103 sourceAccount : nugetUser ,
105104 targetAccount : nugetUser ) ;
@@ -206,6 +205,120 @@ public async Task Evaluate_NonCompliantPackage_CreatesErrorResult(Package nonCom
206205 Assert . False ( newPackageRegistration . IsVerified ) ;
207206 }
208207
208+ [ Fact ]
209+ public async Task Evaluate_NonCompliantPackageAuthor_CreatesErrorResult ( )
210+ {
211+ // Arrange
212+ var nugetUser = new User ( "NuGet" ) ;
213+ var newPackageRegistration = new PackageRegistration { Id = "NewPackageId" , Owners = new List < User > { nugetUser } } ;
214+ var packageAuthors = new [ ] { MicrosoftTeamSubscription . MicrosoftUsername , "The Not-Allowed Package Authors" } ;
215+ var nonCompliantPackage = Fakes . CreateCompliantPackage ( "1.0.0" , newPackageRegistration , packageAuthors ) ;
216+
217+ var policy = RequirePackageMetadataCompliancePolicy . CreatePolicy (
218+ MicrosoftTeamSubscription . Name ,
219+ MicrosoftTeamSubscription . MicrosoftUsername ,
220+ allowedCopyrightNotices : MicrosoftTeamSubscription . AllowedCopyrightNotices ,
221+ allowedAuthors : new [ ] { MicrosoftTeamSubscription . MicrosoftUsername } ,
222+ isLicenseUrlRequired : true ,
223+ isProjectUrlRequired : true ,
224+ errorMessageFormat : Strings . SecurityPolicy_RequireMicrosoftPackageMetadataComplianceForPush ) ;
225+
226+ var policyHandler = new RequirePackageMetadataCompliancePolicy ( ) ;
227+
228+ var context = CreateTestContext (
229+ true ,
230+ new [ ] { policy } ,
231+ nonCompliantPackage ,
232+ packageRegistrationAlreadyExists : false ,
233+ sourceAccount : nugetUser ,
234+ targetAccount : nugetUser ) ;
235+
236+ // Act
237+ var result = await policyHandler . EvaluateAsync ( context ) ;
238+
239+ // Assert
240+ Assert . False ( result . Success ) ;
241+ Assert . Null ( newPackageRegistration . Owners . SingleOrDefault ( u => u . Username == MicrosoftTeamSubscription . MicrosoftUsername ) ) ;
242+ Assert . False ( newPackageRegistration . IsVerified ) ;
243+ }
244+
245+ [ Fact ]
246+ public async Task Evaluate_DuplicatePackageAuthor_CreatesErrorResult ( )
247+ {
248+ // Arrange
249+ var nugetUser = new User ( "NuGet" ) ;
250+ var newPackageRegistration = new PackageRegistration { Id = "NewPackageId" , Owners = new List < User > { nugetUser } } ;
251+ var packageAuthors = new [ ] { MicrosoftTeamSubscription . MicrosoftUsername , MicrosoftTeamSubscription . MicrosoftUsername } ;
252+ var nonCompliantPackage = Fakes . CreateCompliantPackage ( "1.0.0" , newPackageRegistration , packageAuthors ) ;
253+
254+ var policy = RequirePackageMetadataCompliancePolicy . CreatePolicy (
255+ MicrosoftTeamSubscription . Name ,
256+ MicrosoftTeamSubscription . MicrosoftUsername ,
257+ allowedCopyrightNotices : MicrosoftTeamSubscription . AllowedCopyrightNotices ,
258+ allowedAuthors : new [ ] { MicrosoftTeamSubscription . MicrosoftUsername } ,
259+ isLicenseUrlRequired : true ,
260+ isProjectUrlRequired : true ,
261+ errorMessageFormat : Strings . SecurityPolicy_RequireMicrosoftPackageMetadataComplianceForPush ) ;
262+
263+ var policyHandler = new RequirePackageMetadataCompliancePolicy ( ) ;
264+
265+ var context = CreateTestContext (
266+ true ,
267+ new [ ] { policy } ,
268+ nonCompliantPackage ,
269+ packageRegistrationAlreadyExists : false ,
270+ sourceAccount : nugetUser ,
271+ targetAccount : nugetUser ) ;
272+
273+ // Act
274+ var result = await policyHandler . EvaluateAsync ( context ) ;
275+
276+ // Assert
277+ Assert . False ( result . Success ) ;
278+ Assert . Null ( newPackageRegistration . Owners . SingleOrDefault ( u => u . Username == MicrosoftTeamSubscription . MicrosoftUsername ) ) ;
279+ Assert . False ( newPackageRegistration . IsVerified ) ;
280+ }
281+
282+ [ Fact ]
283+ public async Task Evaluate_CompliantPackageAuthors_CreatesSuccessResult ( )
284+ {
285+ // Arrange
286+ var nugetUser = new User ( "NuGet" ) ;
287+ var newPackageRegistration = new PackageRegistration { Id = "NewPackageId" , Owners = new List < User > { nugetUser } } ;
288+ var packageAuthors = new [ ] { MicrosoftTeamSubscription . MicrosoftUsername , "The Most-Awesome Package Authors" } ;
289+ var compliantPackage = Fakes . CreateCompliantPackage ( "1.0.0" , newPackageRegistration , packageAuthors ) ;
290+
291+ var policy = RequirePackageMetadataCompliancePolicy . CreatePolicy (
292+ MicrosoftTeamSubscription . Name ,
293+ MicrosoftTeamSubscription . MicrosoftUsername ,
294+ allowedCopyrightNotices : MicrosoftTeamSubscription . AllowedCopyrightNotices ,
295+ allowedAuthors : packageAuthors ,
296+ isLicenseUrlRequired : true ,
297+ isProjectUrlRequired : true ,
298+ errorMessageFormat : Strings . SecurityPolicy_RequireMicrosoftPackageMetadataComplianceForPush ) ;
299+
300+ var policyHandler = new RequirePackageMetadataCompliancePolicy ( ) ;
301+
302+ var packageOwnershipManagementService = new Mock < IPackageOwnershipManagementService > ( ) ;
303+ packageOwnershipManagementService . Setup ( m => m . AddPackageOwnerAsync ( newPackageRegistration , It . IsAny < User > ( ) , false ) ) . Returns ( Task . CompletedTask ) ;
304+
305+ var context = CreateTestContext (
306+ true ,
307+ new [ ] { policy } ,
308+ compliantPackage ,
309+ packageRegistrationAlreadyExists : false ,
310+ sourceAccount : nugetUser ,
311+ targetAccount : nugetUser ,
312+ packageOwnershipManagementService : packageOwnershipManagementService . Object ) ;
313+
314+ // Act
315+ var result = await policyHandler . EvaluateAsync ( context ) ;
316+
317+ // Assert
318+ Assert . True ( result . Success ) ;
319+ packageOwnershipManagementService . Verify ( s => s . AddPackageOwnerAsync ( newPackageRegistration , Fakes . RequiredCoOwner , false ) , Times . Once ) ;
320+ }
321+
209322 private static PackageSecurityPolicyEvaluationContext CreateTestContext (
210323 bool microsoftUserExists ,
211324 IEnumerable < UserSecurityPolicy > policies ,
@@ -298,7 +411,7 @@ public Fakes(
298411 } ;
299412 }
300413
301- public static Package CreateCompliantPackage ( string version , PackageRegistration packageRegistration )
414+ public static Package CreateCompliantPackage ( string version , PackageRegistration packageRegistration , string [ ] allowedAuthors = null )
302415 {
303416 return new Package
304417 {
@@ -307,7 +420,7 @@ public static Package CreateCompliantPackage(string version, PackageRegistration
307420 Copyright = "(c) Microsoft Corporation. All rights reserved." ,
308421 ProjectUrl = "https://github.com/NuGet/NuGetGallery" ,
309422 LicenseUrl = "https://github.com/NuGet/NuGetGallery/blob/master/LICENSE.txt" ,
310- FlattenedAuthors = "NuGet, Microsoft"
423+ FlattenedAuthors = allowedAuthors == null ? " Microsoft" : string . Join ( "," , allowedAuthors )
311424 } ;
312425 }
313426
@@ -345,7 +458,7 @@ public static IReadOnlyCollection<Package> CreateNonCompliantPackages()
345458 public User Owner { get ; }
346459
347460 public Package NewPackageVersion { get ; }
348-
461+
349462 public PackageRegistration ExistingPackageRegistration { get ; }
350463
351464 public static User RequiredCoOwner { get ; }
0 commit comments