Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add UpdatePackageStreamMetadataAsync to keep the package stream details up to date #5548

Merged
merged 1 commit into from
Feb 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/NuGetGallery.Core/Services/CorePackageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Linq;
using System.Threading.Tasks;
using NuGet.Versioning;
using NuGetGallery.Packaging;

namespace NuGetGallery
{
Expand All @@ -18,6 +19,41 @@ public CorePackageService(IEntityRepository<Package> packageRepository)
_packageRepository = packageRepository ?? throw new ArgumentNullException(nameof(packageRepository));
}

public virtual async Task UpdatePackageStreamMetadataAsync(
Package package,
PackageStreamMetadata metadata,
bool commitChanges = true)
{
if (package == null)
{
throw new ArgumentNullException(nameof(package));
}

if (metadata == null)
{
throw new ArgumentNullException(nameof(metadata));
}

package.Hash = metadata.Hash;
package.HashAlgorithm = metadata.HashAlgorithm;
package.PackageFileSize = metadata.Size;

var now = DateTime.UtcNow;
package.LastUpdated = now;

/// If the package is available, consider this change as an "edit" so that the package appears for cursors
/// on the <see cref="Package.LastEdited"/> field.
if (package.PackageStatusKey == PackageStatus.Available)
{
package.LastEdited = now;
}

if (commitChanges)
{
await _packageRepository.CommitChangesAsync();
}
}

public virtual async Task UpdatePackageStatusAsync(
Package package,
PackageStatus newPackageStatus,
Expand Down
9 changes: 9 additions & 0 deletions src/NuGetGallery.Core/Services/ICorePackageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Threading.Tasks;
using NuGetGallery.Packaging;

namespace NuGetGallery
{
Expand All @@ -10,6 +11,14 @@ namespace NuGetGallery
/// </summary>
public interface ICorePackageService
{
/// <summary>
/// Updates the package properties related to the package stream itself.
/// </summary>
/// <param name="package">The package to update the stream details of.</param>
/// <param name="metadata">The new package stream metadata.</param>
/// <param name="commitChanges">Whether or not to commit the changes to the entity context.</param>
Task UpdatePackageStreamMetadataAsync(Package package, PackageStreamMetadata metadata, bool commitChanges = true);

/// <summary>
/// Set the status on the package and any other related package properties.
/// </summary>
Expand Down
107 changes: 107 additions & 0 deletions tests/NuGetGallery.Core.Facts/Services/CorePackageServiceFacts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,119 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Moq;
using NuGetGallery.Packaging;
using Xunit;

namespace NuGetGallery
{
public class CorePackageServiceFacts
{
public class TheUpdatePackageStreamMetadataMethod
{
[Fact]
public async Task RejectsNullPackage()
{
// Arrange
Package package = null;
var metadata = new PackageStreamMetadata();
var service = CreateService();

// Act & Assert
await Assert.ThrowsAsync<ArgumentNullException>(
() => service.UpdatePackageStreamMetadataAsync(package, metadata, commitChanges: true));
}

[Fact]
public async Task RejectsNullStreamMetadata()
{
// Arrange
var package = new Package();
PackageStreamMetadata metadata = null;
var service = CreateService();

// Act & Assert
await Assert.ThrowsAsync<ArgumentNullException>(
() => service.UpdatePackageStreamMetadataAsync(package, metadata, commitChanges: true));
}

[Theory]
[InlineData(false, 0)]
[InlineData(true, 1)]
public async Task CommitsTheCorrectNumberOfTimes(bool commitChanges, int commitCount)
{
// Arrange
var packageRepository = new Mock<IEntityRepository<Package>>();
var package = new Package();
var metadata = new PackageStreamMetadata();
var service = CreateService(packageRepository: packageRepository);

// Act
await service.UpdatePackageStreamMetadataAsync(package, metadata, commitChanges);

// Assert
packageRepository.Verify(x => x.CommitChangesAsync(), Times.Exactly(commitCount));
}

[Fact]
public async Task UpdatesTheStreamMetadata()
{
// Arrange
var package = new Package
{
Hash = "hash-before",
HashAlgorithm = "hash-algorithm-before",
PackageFileSize = 23,
LastUpdated = new DateTime(2017, 1, 1, 8, 30, 0),
LastEdited = new DateTime(2017, 1, 1, 7, 30, 0),
PackageStatusKey = PackageStatus.Available,
};
var metadata = new PackageStreamMetadata
{
Hash = "hash-after",
HashAlgorithm = "hash-algorithm-after",
Size = 42,
};
var service = CreateService();

// Act
var before = DateTime.UtcNow;
await service.UpdatePackageStreamMetadataAsync(package, metadata, commitChanges: true);
var after = DateTime.UtcNow;

// Assert
Assert.Equal("hash-after", package.Hash);
Assert.Equal("hash-algorithm-after", package.HashAlgorithm);
Assert.Equal(42, package.PackageFileSize);
Assert.InRange(package.LastUpdated, before, after);
Assert.NotNull(package.LastEdited);
Assert.InRange(package.LastEdited.Value, before, after);
Assert.Equal(package.LastUpdated, package.LastEdited);
}

[Theory]
[InlineData(PackageStatus.Deleted)]
[InlineData(PackageStatus.Validating)]
[InlineData(PackageStatus.FailedValidation)]
public async Task DoesNotUpdateLastEditedWhenNotAvailable(PackageStatus packageStatus)
{
// Arrange
var originalLastEdited = new DateTime(2017, 1, 1, 7, 30, 0);
var package = new Package
{
LastEdited = originalLastEdited,
PackageStatusKey = packageStatus,
};
var metadata = new PackageStreamMetadata();
var service = CreateService();

// Act
await service.UpdatePackageStreamMetadataAsync(package, metadata, commitChanges: true);

// Assert
Assert.Equal(originalLastEdited, package.LastEdited);
}
}

public class TheUpdatePackageStatusMethod
{
[Fact]
Expand Down