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 endpoints for managing API delivery channel policies #739

Merged
merged 35 commits into from
Feb 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
d91cfbd
Add HydraDeliveryChannelPolicyValidator, DeliveryChannelPolicy Hydra …
griffri Feb 13, 2024
d567b65
Add DeliveryChannelPolicy converter class, add GetDeliveryChannelPoli…
griffri Feb 13, 2024
68c0b64
Implement DELETE and GET Delivery Channel Policy
griffri Feb 14, 2024
e35d447
Implement CreateDeliveryChannelPolicy request, add Created property t…
griffri Feb 14, 2024
71d1daa
Use DateTime.UtcNow for delivery channel policy timestamps
griffri Feb 14, 2024
34379e2
Add Get_DeliveryChannelPolicy_200() and Get_DeliveryChannelPolicy_404…
griffri Feb 14, 2024
5d87794
Add UpdateDeliveryChannel work in progress
griffri Feb 15, 2024
fc3cfcc
Implement PATCH route for DeliveryChannelPolicyController
griffri Feb 16, 2024
f9cd069
Include Thumbnails channel in AssetDeliveryChannels
griffri Feb 16, 2024
026991f
Validate policyData in PATCH, PUT and POST
griffri Feb 16, 2024
ed8307e
Remove image from policy type whitelist, Rename IsValidDeliveryChanne…
griffri Feb 16, 2024
741dc11
Move delivery channel policy tests into a separate file
griffri Feb 16, 2024
a2088c5
Include full URL in delivery channel policy ID
griffri Feb 16, 2024
e17aaf8
Implement /deliveryChannelPolicies and HydraNestedCollection class
griffri Feb 16, 2024
0b3ef46
Include ProducesResponseType annotations, check that the parameter to…
griffri Feb 21, 2024
aacf58c
Rename existing IsValidDeliveryChannel to IsPermittedDeliveryChannel …
griffri Feb 21, 2024
59c542d
Exclude Customer 99 delivery channel policies from deletion, use full…
griffri Feb 21, 2024
26ce5bc
Rename PolicyDataValidator to DeliveryChannelPolicyDataValidator, mak…
griffri Feb 21, 2024
9c0de47
Add tests for DeliveryChannelPolicyDataValidator, disallow empty iiif…
griffri Feb 21, 2024
96c7bd4
Rename DeliveryChannelPolicies folders to DeliveryChannels
griffri Feb 21, 2024
026d97e
Fix double slash in HydraNestedCollection Id
griffri Feb 21, 2024
cb073f4
Add POST, PUT, PATCH and DELETE tests
griffri Feb 21, 2024
7ae9921
Add delivery channel policy collection tests, fix invalid policyData …
griffri Feb 22, 2024
82d970b
Add Patch invalid policy data, Delete_404_IfNotFound and Put_400_IfCh…
griffri Feb 22, 2024
8fc766a
Ensure that delivery channel policy names don't contain whitespace or…
griffri Feb 22, 2024
e2398f3
Fix issue that caused parent of a nested collection to be missing in …
griffri Feb 22, 2024
722a81d
Separate PUT and PATCH validation rules for HydraDeliveryChannelPolicy
griffri Feb 22, 2024
6ef8ead
Omit empty string from Patch test parameters (as PATCH returns 500 if…
griffri Feb 22, 2024
d7c2c33
Update HydraDeliveryChannelPolicyValidatorTests to test Patch and Put…
griffri Feb 22, 2024
986b59c
Move name validation to HydraDeliveryChannelPolicyValidator, Add Swag…
griffri Feb 22, 2024
a426582
Fix issues raised in review:
griffri Feb 23, 2024
b0e9ef6
Add mediatr request for getting delivery channel policy collections, …
griffri Feb 23, 2024
0882372
Fix more issues raised in review
griffri Feb 23, 2024
a60fe8f
Address issues raised in review
griffri Feb 27, 2024
301da79
Build delivery channel policy collections model in controller, change…
griffri Feb 27, 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
using API.Features.DeliveryChannels.Validation;

namespace API.Tests.Features.DeliveryChannelPolicies.Validation;

public class DeliveryChannelPolicyDataValidatorTests
{
private readonly DeliveryChannelPolicyDataValidator sut;

public DeliveryChannelPolicyDataValidatorTests()
{
sut = new DeliveryChannelPolicyDataValidator();
}

[Theory]
[InlineData("[\"400,400\",\"200,200\",\"100,100\"]")]
[InlineData("[\"!400,400\",\"!200,200\",\"!100,100\"]")]
[InlineData("[\"400,\",\"200,\",\"100,\"]")]
[InlineData("[\"!400,\",\"!200,\",\"!100,\"]")]
[InlineData("[\"400,400\"]")]
public void PolicyDataValidator_ReturnsTrue_ForValidThumbSizes(string policyData)
{
// Arrange And Act
var result = sut.Validate(policyData, "thumbs");

// Assert
result.Should().BeTrue();
}

[Fact]
public void PolicyDataValidator_ReturnsFalse_ForBadThumbSizes()
{
// Arrange
var policyData = "[\"400,400\",\"foo,bar\",\"100,100\"]";

// Act
var result = sut.Validate(policyData, "thumbs");

// Assert
result.Should().BeFalse();
}

[Fact]
public void PolicyDataValidator_ReturnsFalse_ForInvalidThumbSizesJson()
{
// Arrange
var policyData = "[\"400,400\",";

// Act
var result = sut.Validate(policyData, "thumbs");

// Assert
result.Should().BeFalse();
}

[Theory]
[InlineData("")]
[InlineData("[]")]
[InlineData("[\"\"]")]
public void PolicyDataValidator_ReturnsFalse_ForEmptyThumbSizes(string policyData)
{
// Arrange and Act
var result = sut.Validate(policyData, "thumbs");

// Assert
result.Should().BeFalse();
}

[Fact]
public void PolicyDataValidator_ReturnsTrue_ForValidAvPolicy()
{
// Arrange
var policyData = "[\"media-format-quality\"]"; // For now, any single string values are accepted - this will need
// to be rewritten once the API requires policies that exist

// Act
var result = sut.Validate(policyData, "iiif-av");

// Assert
result.Should().BeTrue();
}

[Theory]
[InlineData("[\"\"]")]
[InlineData("[\"policy-1\",\"\"]")]
public void PolicyDataValidator_ReturnsFalse_ForBadAvPolicy(string policyData)
{
// Arrange and Act
var result = sut.Validate(policyData, "iiif-av");

// Assert
result.Should().BeFalse();
}

[Theory]
[InlineData("")]
[InlineData("[]")]
[InlineData("[\"\"]")]
public void PolicyDataValidator_ReturnsFalse_ForEmptyAvPolicy(string policyData)
{
// Arrange and Act
var result = sut.Validate(policyData, "iiif-av");

// Assert
result.Should().BeFalse();
}

[Fact]
public void PolicyDataValidator_ReturnsFalse_ForInvalidAvPolicyJson()
{
// Arrange
var policyData = "[\"policy-1\",";

// Act
var result = sut.Validate(policyData, "iiif-av");

// Assert
result.Should().BeFalse();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using System;
using API.Features.DeliveryChannels.Validation;
using DLCS.HydraModel;
using FluentValidation.TestHelper;

namespace API.Tests.Features.DeliveryChannelPolicies.Validation;

public class HydraDeliveryChannelPolicyValidatorTests
{
private readonly HydraDeliveryChannelPolicyValidator sut;

public HydraDeliveryChannelPolicyValidatorTests()
{
sut = new HydraDeliveryChannelPolicyValidator(new DeliveryChannelPolicyDataValidator());
}

[Fact]
public void NewDeliveryChannelPolicy_CannotHave_AssetId()
{
var policy = new DeliveryChannelPolicy()
{
Id = "foo",
};
var result = sut.TestValidate(policy);
result.ShouldHaveValidationErrorFor(p => p.Id);
}

[Fact]
public void NewDeliveryChannelPolicy_CannotHave_CustomerId()
{
var policy = new DeliveryChannelPolicy()
{
CustomerId = 1,
};
var result = sut.TestValidate(policy);
result.ShouldHaveValidationErrorFor(p => p.CustomerId);
}

[Fact]
public void NewDeliveryChannelPolicy_CannotHave_PolicyCreated()
{
var policy = new DeliveryChannelPolicy()
{
Created = DateTime.UtcNow
};
var result = sut.TestValidate(policy);
result.ShouldHaveValidationErrorFor(p => p.Created);
}

[Fact]
public void NewDeliveryChannelPolicy_CannotHave_PolicyModified()
{
var policy = new DeliveryChannelPolicy()
{
Modified = DateTime.UtcNow
};
var result = sut.TestValidate(policy);
result.ShouldHaveValidationErrorFor(p => p.Modified);
}

[Fact]
public void NewDeliveryChannelPolicy_Requires_Name_OnPost()
{
var policy = new DeliveryChannelPolicy()
{
Name = null
};
var result = sut.TestValidate(policy, p => p.IncludeRuleSets("default", "post"));
result.ShouldHaveValidationErrorFor(p => p.Name);
}

[Fact]
public void NewDeliveryChannelPolicy_Requires_PolicyData_OnPost()
{
var policy = new DeliveryChannelPolicy()
{
PolicyData = null,
};
var result = sut.TestValidate(policy, p => p.IncludeRuleSets("default", "post"));
result.ShouldHaveValidationErrorFor(p => p.PolicyData);
}

[Fact]
public void NewDeliveryChannelPolicy_Requires_PolicyData_OnPut()
{
var policy = new DeliveryChannelPolicy()
{
PolicyData = null,
};
var result = sut.TestValidate(policy, p => p.IncludeRuleSets("default", "put"));
result.ShouldHaveValidationErrorFor(p => p.PolicyData);
}
}
2 changes: 1 addition & 1 deletion src/protagonist/API.Tests/Integration/CustomerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ public async Task NewlyCreatedCustomer_RollsBackSuccessfully_WhenDeliveryChannel
}";
var content = new StringContent(customerJson, Encoding.UTF8, "application/json");

dbContext.DeliveryChannelPolicies.Add(new DeliveryChannelPolicy()
dbContext.DeliveryChannelPolicies.Add(new DLCS.Model.Policies.DeliveryChannelPolicy()
{
Id = 250,
DisplayName = "A default audio policy",
Expand Down
Loading
Loading