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 ImageOptimisationPolicy and ThumbnailPolicy support to LegacyModeConverter #860

Merged
merged 21 commits into from
Jun 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
52372e4
Translate IOP/TP in LegacyModeConverter when EmulateOldDeliveryChanne…
griffri May 29, 2024
41ca7e8
Add tests for creating new image assets with legacy + old delivery ch…
griffri May 29, 2024
c268c6f
Add legacy video-max/audio-max IOP tests
griffri May 29, 2024
e68bf3f
Add further tests for disabled old delivery channel properties
griffri May 31, 2024
1b01488
Allow assets to be updated without specifying any delivery channels i…
griffri May 31, 2024
2dfa939
Add customer queue tests for legacy payloads using IOP/TP
griffri May 31, 2024
8d9b8f1
Reject bad ImageOptimisationPolicies and ThumbnailPolicies in LegacyM…
griffri May 31, 2024
9301f6e
Add tests for legacy assets provided with an invalid IOP/TP
griffri May 31, 2024
ff72ef8
Add tests for LegacyModeConverter errors
griffri Jun 3, 2024
c506614
Add test for file asset creation
griffri Jun 3, 2024
8b525eb
Remove EmulateOldDeliveryChannelProperties setting
griffri Jun 3, 2024
6c6f3ed
Add tests for updating existing assets in legacy mode, require origin…
griffri Jun 4, 2024
4505932
Add Fails_WhenOriginNotSpecified test
griffri Jun 4, 2024
be67187
Handle LegacyModeConverter errors in CustomerQueueController
griffri Jun 4, 2024
f1873fc
Use GetAssetId() to generate asset ID for legacy IOP/TP tests
griffri Jun 4, 2024
d99ee63
Remove redundant legacy mode check
griffri Jun 4, 2024
c13e9d2
Reword IOP/TP rejection messages
griffri Jun 4, 2024
2fb94ae
Return status code from thrown exception
griffri Jun 5, 2024
e554988
Remove duplicated checks in QueuePostValidator
donaldgray Jun 5, 2024
68e2f00
Improve LegacyModeConverter handling
donaldgray Jun 5, 2024
f1a0569
Fix tests for legacyModeConverter
donaldgray Jun 5, 2024
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
346 changes: 341 additions & 5 deletions src/protagonist/API.Tests/Converters/LegacyModeConverterTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
using API.Converters;
using System;
using API.Converters;
using API.Exceptions;
using DLCS.HydraModel;
using DLCS.Model.Assets;
using AssetFamily = DLCS.HydraModel.AssetFamily;

namespace API.Tests.Converters;

Expand All @@ -9,7 +13,8 @@ public class LegacyModeConverterTests
public void VerifyAndConvertToModernFormat_ChangesNothing_WithNewFormat()
{
// Arrange
var hydraImage = new Image{ MediaType = "type", MaxUnauthorised = 5, Family = AssetFamily.File};
var hydraImage = new Image{ MediaType = "type", Origin = "https://example.org/my-asset",
MaxUnauthorised = 5, Family = AssetFamily.File };

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);
Expand All @@ -20,11 +25,32 @@ public void VerifyAndConvertToModernFormat_ChangesNothing_WithNewFormat()
convertedImage.Family.Should().Be(hydraImage.Family);
}

[Fact]
public void VerifyAndConvertToModernFormat_Fails_WhenOriginNotSpecified()
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Timebased
};

// Act
Action action = () =>
LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
action.Should()
.Throw<APIException>()
.WithMessage("An origin is required when legacy mode is enabled")
.And.StatusCode.Should().Be(400);
}

[Fact]
public void VerifyAndConvertToModernFormat_SetsMediaType_WithNotSet()
{
// Arrange
var hydraImage = new Image{ MaxUnauthorised = 5, Family = AssetFamily.File};
var hydraImage = new Image{ MaxUnauthorised = 5, Family = AssetFamily.File,
Origin = "https://example.org/my-asset"};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);
Expand Down Expand Up @@ -99,12 +125,322 @@ public void VerifyAndConvertToModernFormat_MaxUnauthorisedUnchanged_WhenRolesSet
public void VerifyAndConvertToModernFormat_ModelIdSet_WhenNoModelId()
{
// Arrange
var hydraImage = new Image{ Id = "https://test/someId", MediaType = "something"};
var hydraImage = new Image{ Id = "https://test/someId", MediaType = "something",
Origin = "https://example.org/my-asset" };

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.ModelId.Should().Be("someId");
}
}

[Fact]
public void VerifyAndConvertToModernFormat_AddsDeliveryChannels_WhenNotSet_ForImage()
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Image,
Origin = "something.jpg",
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Image &&
dc.Policy == null,
dc => dc.Channel == AssetDeliveryChannels.Thumbnails &&
dc.Policy == null);
}

[Theory]
[InlineData("", "")]
[InlineData(null, null)]
[InlineData("http://dlc.io/imageOptimisationPolicies/", "http://dlc.io/thumbnailPolicies/")]
public void VerifyAndConvertToModernFormat_AddsDeliveryChannels_WhenProvidedWithoutPolicy_ForImage(string iop, string tp)
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Image,
Origin = "something.jpg",
ImageOptimisationPolicy = iop,
ThumbnailPolicy = tp
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Image &&
dc.Policy == null,
dc => dc.Channel == AssetDeliveryChannels.Thumbnails &&
dc.Policy == null);
}

[Fact]
public void VerifyAndConvertToModernFormat_AddsDeliveryChannels_WhenNotSet_ForVideo()
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Timebased,
Origin = "something.mp4",
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Timebased &&
dc.Policy == null);
}

[Fact]
public void VerifyAndConvertToModernFormat_AddsDeliveryChannels_WhenNotSet_ForAudio()
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Timebased,
Origin = "something.mp3",
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Timebased &&
dc.Policy == null);
}

[Fact]
public void VerifyAndConvertToModernFormat_AddsDeliveryChannels_WhenNotSet_ForFile()
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.File,
Origin = "something.pdf",
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.File &&
dc.Policy == "none");
}

[Theory]
[InlineData("mp3")]
[InlineData("mp4")]
[InlineData("pdf")]
public void VerifyAndConvertToModernFormat_TreatsAsImage_ForNonImagesWithoutFamily(string fileExtension)
{
// Arrange
var hydraImage = new Image()
{
Origin = $"something.{fileExtension}",
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Image,
dc => dc.Channel == AssetDeliveryChannels.Thumbnails);
}

[Theory]
[InlineData("fast-higher")]
[InlineData("https://api.dlc.services/imageOptimisationPolicies/fast-higher")]
public void VerifyAndConvertToModernFormat_AddsImageDeliveryChannelsWithPolicies_WhenFastHigherImageOptimisationPolicySpecified(
string imageOptimisationPolicy)
{
// Arrange
var hydraImage = new Image()
{
Origin = "something.jpg",
ImageOptimisationPolicy = imageOptimisationPolicy
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Image &&
dc.Policy == "default",
dc => dc.Channel == AssetDeliveryChannels.Thumbnails &&
dc.Policy == null);
}

[Theory]
[InlineData("default")]
[InlineData("https://api.dlc.services/thumbnailPolicies/default")]
public void VerifyAndConvertToModernFormat_AddsImageDeliveryChannelsWithPolicies_WhenDefaultThumbnailPolicySpecified(
string thumbnailPolicy)
{
// Arrange
var hydraImage = new Image()
{
Origin = "something.jpg",
ThumbnailPolicy = thumbnailPolicy
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Image &&
dc.Policy == null,
dc => dc.Channel == AssetDeliveryChannels.Thumbnails &&
dc.Policy == "default");
}

[Theory]
[InlineData("fast-higher", "default")]
[InlineData("https://api.dlc.services/imageOptimisationPolicies/fast-higher",
"https://api.dlc.services/thumbnailPolicies/default")]
public void VerifyAndConvertToModernFormat_AddsImageDeliveryChannelsWithPolicies_WithBothPolicyTypesSpecified(
string imageOptimisationPolicy, string thumbnailPolicy)
{
// Arrange
var hydraImage = new Image()
{
Origin = "something.jpg",
ImageOptimisationPolicy = imageOptimisationPolicy,
ThumbnailPolicy = thumbnailPolicy
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Image &&
dc.Policy == "default",
dc => dc.Channel == AssetDeliveryChannels.Thumbnails &&
dc.Policy == "default");
}

[Theory]
[InlineData("video-max")]
[InlineData("https://api.dlc.services/imageOptimisationPolicies/video-max")]
public void VerifyAndConvertToModernFormat_AddsTimebasedDeliveryChannelWithPolicy_WhenVideoMaxSpecified(
string imageOptimisationPolicy)
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Timebased,
Origin = "something.mp4",
ImageOptimisationPolicy = imageOptimisationPolicy
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Timebased &&
dc.Policy == "default-video");
griffri marked this conversation as resolved.
Show resolved Hide resolved
}

[Theory]
[InlineData("audio-max")]
[InlineData("https://api.dlc.services/imageOptimisationPolicies/audio-max")]
public void VerifyAndConvertToModernFormat_AddsTimebasedDeliveryChannelWithPolicy_WhenAudioMaxSpecified(
string imageOptimisationPolicy)
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Timebased,
Origin = "something.mp3",
ImageOptimisationPolicy = imageOptimisationPolicy
};

// Act
var convertedImage = LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
convertedImage.DeliveryChannels.Should().Satisfy(
dc => dc.Channel == AssetDeliveryChannels.Timebased &&
dc.Policy == "default-audio");
}

[Fact]
public void VerifyAndConvertToModernFormat_Fails_WhenInvalidImageOptimisationPolicySpecified_ForImageAsset()
{
// Arrange
var hydraImage = new Image()
{
Origin = "something.tiff",
ImageOptimisationPolicy = "not-a-policy"
};

// Act
Action action = () =>
LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
action.Should()
.Throw<APIException>()
.WithMessage($"'not-a-policy' is not a valid imageOptimisationPolicy for an image")
.And.StatusCode.Should().Be(400);
}

[Fact]
public void VerifyAndConvertToModernFormat_Fails_WhenInvalidThumbnailPolicySpecified_ForImageAsset()
{
// Arrange
var hydraImage = new Image()
{
Origin = "something.tiff",
ThumbnailPolicy = "not-a-policy"
};

// Act
Action action = () =>
LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
action.Should()
.Throw<APIException>()
.WithMessage($"'not-a-policy' is not a valid thumbnailPolicy for an image")
.And.StatusCode.Should().Be(400);
}

[Fact]
public void VerifyAndConvertToModernFormat_Fails_WhenImageOptimisationPolicySpecified_ForTimebasedAsset()
{
// Arrange
var hydraImage = new Image()
{
Family = AssetFamily.Timebased,
Origin = "something.mp4",
ImageOptimisationPolicy= "not-a-policy"
};

// Act
Action action = () =>
LegacyModeConverter.VerifyAndConvertToModernFormat(hydraImage);

// Assert
action.Should()
.Throw<APIException>()
.WithMessage($"'not-a-policy' is not a valid imageOptimisationPolicy for a timebased asset")
.And.StatusCode.Should().Be(400);
}
}
Loading
Loading